изменение основных выпадающих меню ралли после отображения

У меня есть rally.sdk.ui.basic.Dropdown меню в приложении Rally, которое я хотел бы изменить на основе ввода пользователя. Поэтому я вызову display() в раскрывающемся меню, а позже я хочу изменить содержимое этого меню.

Кто-нибудь сделал это? Когда я пытаюсь, он вылетает. Я также пробовал вызывать destroy() в раскрывающемся меню, а затем вызывать display() в новом меню, которое я выделяю, но это также вылетает с неясной ошибкой dojo.

Любые предложения о том, как изменить выпадающие меню на лету?

Я включил очень урезанный пример ниже попытки уничтожить, а затем повторно отобразить меню:

<html>
  <head>
    <title>Incoming Defects by Severity</title>
    <meta http-equiv="X-UA-Compatible" content="IE=7" >
    <meta name="Name"    content="Defects by Severity" />

    <script type="text/javascript" src="https://rally1.rallydev.com/apps/1.29/sdk.js"></script>

    <script type="text/javascript">
        function DefectChart() {
            this.display = function() {
                var defectVersionDropdown;
                var count = 1;

                function makeDefectChart(results){
                    initDefectVersionDropdown();
                };

                function renderPage() {
                    var queryConfig = [];
                    var startDate   = '2011-06-06';
                    var endDate     = '2012-02-02';
                    var queryArray  = ['CreatedDate >= "' + startDate + '"', 'CreatedDate <= "' + endDate + '"'];
                    var versionFilter       = defectVersionDropdown ? defectVersionDropdown.getDisplayedValue() : 'ALL';
                        if (versionFilter != 'ALL') {
                            queryArray.push('FoundInBuild contains "' + versionFilter + '"');
                        }   
// console.log(queryArray);
                    queryConfig.push({
                        type : 'Defects',
                        key  : 'defects',
                        query:  rally.sdk.util.Query.and(queryArray),
                        fetch: 'Severity,State,LastUpdateDate,CreationDate,OpenedDate,AcceptedDate,LastUpdateDate,ClosedDate,Environment,FoundInBuild'
                    });

                    rallyDataSource.findAll(queryConfig, makeDefectChart);
                }

                function defectVersionChange(sender, eventArgs) {
                    var version = eventArgs.value;

                    renderPage();
                }

                function initDefectVersionDropdown() {
                    if (defectVersionDropdown != null) {
                        defectVersionDropdown.destroy();
                        defectVersionDropdown = null;
                    }

                    if (defectVersionDropdown == null) {
                  console.log('initDefectVersionDropdown'); 
                        count++;
                        var menuItems   = [{label: "ALL", value: "ALL"}];
                            for (var i=0; i < count; i++) {
                                menuItems.push({label: count, value: count});
                            }
                        var config  = {
                                label:  "Found In Version:",
                                items:  menuItems
                             };

                        defectVersionDropdown   = new rally.sdk.ui.basic.Dropdown(config);

                        defectVersionDropdown.addEventListener("onChange", defectVersionChange);
                        defectVersionDropdown.display("defectVersionDiv");
                    }
                }

                var workspaceOid    = '__WORKSPACE_OID__';  if (workspaceOid.toString().match(/__/))    { workspaceOid  = XXX; }
                var projectOid      = '__PROJECT_OID__';    if (projectOid.toString().match(/__/))      { projectOid    = XXX; }

                rallyDataSource = new rally.sdk.data.RallyDataSource(   workspaceOid,
                                                                        projectOid,
                                                                        '__PROJECT_SCOPING_UP__',
                                                                        '__PROJECT_SCOPING_DOWN__');
                initDefectVersionDropdown();
                renderPage();
            }
        }

        function getDataAndShow() {
            var defectChart = new DefectChart();

            defectChart.display();
        }

        function loadRally() {
            rally.addOnLoad(getDataAndShow);
        }

        loadRally();
    </script>
  </head>
  <body>
    <div id="defectVersionDiv"></div>
  </body>
</html>

person kimon    schedule 08.02.2012    source источник


Ответы (1)


Уничтожение старого, создание и отображение нового - правильный способ сделать это. Это распространенный шаблон при разработке приложений с использованием App SDK. Если вы предоставите код, вырезанный вместе с ошибкой dojo, которую вы получаете, сообщество, вероятно, может оказать лучшую помощь.

person Kyle Morse    schedule 08.02.2012
comment
Я добавил урезанный код, который не дает сбоев в firefox, когда display вызывается во второй раз после завершения запроса ралли. Я получаю сообщение об ошибке: dojo.data.ItemFileReadStore: данные json, предоставленные аргументами создания, искажены. Элементы в списке имеют идентификатор: [значение]. Столкнулось значение: [2] addOnLoad(_1b=rally1.rallydev…component_01-17-2012.js;, _1c=undefined)sdk.js (строка 8) addOnLoad() - person kimon; 08.02.2012
comment
В коде я запускаю меню, затем делаю запрос Rally на наличие дефектов. Когда я получаю результат, я уничтожаю меню и создаю новое — в примере кода я просто создаю бессмысленное меню с цифрами в качестве примера. Одно интересное замечание: если я уничтожаю и заново создаю меню, но в нем есть те же элементы, что и раньше, оно не падает. Только если меню другое, вылетает. Странно... - person kimon; 08.02.2012
comment
Ваш текущий код дает сбой, потому что в раскрывающемся списке есть конфликт значений - они должны быть уникальными. (В примере кода есть два объекта со значением = 2). - person Kyle Morse; 08.02.2012