Как получить коллекцию элементов управления по типу в xpages

Можно ли получить коллекцию управления по его типу, например. Label, элементы управления dojo, такие как поле редактирования, поле со списком и т. д. В общем, я хотел получить набор из 10 элементов управления Label из диалогового окна extlib.

Спасибо за помощь.


person Dragon Chow    schedule 28.12.2012    source источник


Ответы (2)


XPages построен на JSF, так что да. Вы начинаете с окружающего элемента (xp:view, если хотите все) и проходите по дочерним элементам. Имена классов - это то, что вы ищете. Проверьте проект панели инструментов отладки XPages на OpenNTF для получения образца кода.

Чтобы было ясно: JSF организует элементы управления в деревьях, поэтому вам нужно рекурсивно вызывать getChildren() до тех пор, пока не останется больше элементов, чтобы получить их все. Панель инструментов отладки сделала все это, так что идите и получите исходники.

Код, который вы ищете, находится в функции getComponentIds() в библиотеке скриптов xpDebugToolbar. Первоначально он был написан Томми Валандом для его инспектора API.

person stwissel    schedule 29.12.2012
comment
Спасибо. Я пытался получить компонент (tableId).getChildren, но возвращал все строки. Я ожидал, что все метки и их идентификаторы целевого элемента управления будут в этой таблице. Я до сих пор не очень понимаю в xpages. Я попытался найти пример кода на OpenNTF, но перегружен тоннами документов, но безуспешно :-) Не могли бы вы поконкретнее. На самом деле я ищу что-то вроде getElementbyType (управление меткой), используя ssjs. Большое спасибо - person Dragon Chow; 31.12.2012
comment
Это очень полезный сайт, чтобы получить представление: blog.ecafechat.com/useless-documentation - person Dragon Chow; 01.01.2013
comment
Привет, Дракон, можешь ли ты предоставить свое решение здесь? У других тоже может быть вопрос, и знать только, что вы преуспели, нехорошо. Как вам это удалось, было бы куда приятнее! - person stwissel; 02.01.2013
comment
Дети таблицы - это строки - это правильно. JSF организует элементы управления в деревьях, поэтому вы получаете дочерние элементы строк, которые будут ячейками, а затем их дочерними элементами. - person stwissel; 02.01.2013

Вот мой код.

var myUtil = {
    myArray : new Array(),

    getComponentIDsByType : function(parentComp, parent, className) {
        /*
        parentComp: getComponent("controlId") or view for all
        parent: null or parent of parentComp
        className: class name of component
        Example of usage:
        wnUtil.getComponentIDsByType(getComponent("tableId"), null, "com.ibm.xsp.OutputLabel");
        wnUtil.getComponentIDsByType(getComponent("tableId"), null, "com.ibm.xsp.extlib.dojo.form.FilteringSelect");
        wnUtil.getComponentIDsByType(view, null, "com.ibm.xsp.extlib.dojo.form.FilteringSelect");       
        */
        var itr = parentComp.getChildren().iterator();
        while(itr.hasNext()) {
            var c:com.ibm.xsp.component.xp.XspScriptCollector = itr.next();
            if(!parent) parent = parentComp;
            var p = parentComp;
            if(p && p.getId() && !p.getId().match(/^_id/i) && !p.getId().match(/^event/i) && !p.getId().match(/^selectItem/i) && !p.getId().match(/^dateTimeHelper/i) && !p.getId().match(/^br/i)) {
                parent = parentComp;
            }
            if(c.getId() && !c.getId().match(/^_id/i) && !c.getId().match(/^event/i) && !c.getId().match(/^selectItem/i) && !c.getId().match(/^dateTimeHelper/i) && !c.getId().match(/^br/i) && !c.getId().match(/^typeAhead/i) && !c.getRendererType().equalsIgnoreCase('com.ibm.xsp.PassThroughTagRenderer')) {
                //d.replaceItemValue("control", c.getId());
                //if(parent) d.replaceItemValue("parent", parent.getId());
                //d.replaceItemValue("type", this.getType(c.getRendererType()));
                if (c.getRendererType() == className) {
                    //print (c.getId() + "<<<>>" + c.getRendererType());
                    // store component id to an array
                    this.myArray.push(c.getId());
                }           
            }
            this.getComponentIDsByType(c, parent, className);
        }
    }   
}

Затем вы просто перебираете myUtil.myArray

person Dragon Chow    schedule 10.01.2013