Rally 拉力SDK下拉列表

Rally 拉力SDK下拉列表,rally,Rally,我正在尝试使用Rally sdk编写一些js,以获取与项目相关的团队成员列表。我的下拉框将包含我的当前项目及其子项目的列表。一旦选中,它将给出所选项目的团队成员列表 到目前为止,我尝试了两种方法: 这是一种没有所有子项目的非常简单的方法,在这种方法中,我只获取当前项目的第一级子项目(而不是递归地获取所有子项目) 递归获取当前项目的所有子项目 到目前为止,我只能够完成(1)并在下拉列表中获取所有一级子项目(尚未进一步获取团队成员)。但是,我在方法(2)中遇到了一些问题 使用递归,我能够获得数组中的

我正在尝试使用Rally sdk编写一些js,以获取与项目相关的团队成员列表。我的下拉框将包含我的当前项目及其子项目的列表。一旦选中,它将给出所选项目的团队成员列表

到目前为止,我尝试了两种方法:

  • 这是一种没有所有子项目的非常简单的方法,在这种方法中,我只获取当前项目的第一级子项目(而不是递归地获取所有子项目)

  • 递归获取当前项目的所有子项目

  • 到目前为止,我只能够完成(1)并在下拉列表中获取所有一级子项目(尚未进一步获取团队成员)。但是,我在方法(2)中遇到了一些问题

    使用递归,我能够获得数组中的所有项目并正确地推送它,但是列表不会显示在下拉框中。请注意,我是通过在Rally中复制粘贴自定义html来测试我的代码的。我也不会得到任何错误来理解可能的错误

    这是我的方法1:

    <script type="text/javascript">
    
        var projects_array = new Array();
        var child_project = new Array();
        function onLoad() {
            //Add app code here
    
    
            loadProjectDropdown();
        }
    
        function loadProjectDropdown()
        {
    
              var rallyDataSource = new rally.sdk.data.RallyDataSource("__WORKSPACE_OID__","__PROJECT_OID__","__PROJECT_SCOPING_UP__","__PROJECT_SCOPING_DOWN__");
    
    
            var queryArray = new Array();
            queryArray.push({
                key:"projects",
                type:"project",
                fetch: "Children,Name",
                query: rally.sdk.util.Query('ObjectID = "' + '__PROJECT_OID__' + '"')   
    
                });
    
            rallyDataSource.findAll(queryArray,processQueryArray);
    
        }
    
        function processQueryArray(results){
    
            var data = new Array();
    
            var project = results.projects;
    
            /*
             * 
             * This is just a test from Rohan
             */
            var all_projects = new Array();
            data.push({label: project[0].Name, value: project[0].Name});
    
            if(project[0].Children != null)
            {
                for(var i=0;i<project[0].Children.length;i++)
                {
                    //document.write("Number "+i+" "+project[0].Children[i].Name);
                    data.push({label: project[0].Children[i].Name, value: project[0].Children[i].Name});
                }
            }
    
    
            //pass the first parent project to a function that recursively gets all child projects.
    
            //all_projects = get_child_recursively(project[0]); 
    
    
            //document.write(JSON.stringify(all_projects));
    
            /*for(var i=0;i<all_projects.length;i++)
            {
                data.push({label: all_projects[i].Name, value: all_projects[i].Name});
                //document.write(JSON.stringify(all_projects[i]));
                //data.push({label: all_projects[i].Name, value: all_projects[i].Name});
            }*/
    
            projectDropDown = new rally.sdk.ui.basic.Dropdown({label: "Select Project", items: data, width: 250});
            projectDropDown.display("projectDropDown",projectDropDownChanged);
        }
    
        //Recursive algorithm to get all child projects of a parent project
        //Nothing wrong with this code, I have commented this function for appraoch 1
        function get_child_recursively(parent_project)
        { 
    
                //check if this project is in array
                projects_array.push(parent_project);
    
                if(parent_project.Children.length>0)
                {
                    for(var i=0;i<parent_project.Children.length;i++)
                    {
                        if(child_project.indexOf(parent_project.Children[i])<=-1)
                            child_project.push(parent_project.Children[i]);
                    }
                    for(var i=0;i<child_project.length;i++)
                    {   var temp = child_project[i];
                        child_project.splice(i,1);
                        get_child_recursively(temp);
                    }
                }
                else{
                    return;
                }
    
                if(child_project.length==0 || child_project.length==1){
                    return projects_array;
                }
    
        }      
        function projectDropDownChanged(dropdown,eventArgs){
    
            projectName = eventArgs.value;
    
            //loadTeamMembersDropDown();
    
        }
    
        function loadTeamMembersDropDown(){
    
            var rallyDataSource = new rally.sdk.data.RallyDataSource("__WORKSPACE_OID__","__PROJECT_OID__","__PROJECT_SCOPING_UP__","__PROJECT_SCOPING_DOWN__");
            var rallyqueryObject = {
                key: "projects",
                type: "project",
                fetch: "TeamMembers,Name",
                query: rally.sdk.util.Query('Name = "' + projectName + '"' ),
                order: "Name desc"
            };
    
            rallyDataSource.findAll(rallyqueryObject,processTeamMemberResult);
        }
        function processTeamMemberResult(results){
    
            var teamMember = results.projects;
        }
        rally.addOnLoad(onLoad);
    
    
    </script>
    
        <style type="text/css">
    
            .teamApp {
            /* Add app styles here */
            }
    
        </style>
    
    我尝试了各种调试方法,在方法1中打印
    数据
    数组,在方法2中打印
    数据
    数组,并比较了存储的JSON格式,两者看起来都很相似。但是,由于某种原因,方法1中的
    数据
    数组是由下拉框加载的,而当我尝试从方法2中加载
    数据
    数组时,我什么也看不到


    非常感谢您的任何建议

    我建议使用最新的AppSDK 2rc1。可提供相关文档。 在下面的代码中,我构建了两个下拉列表。首先是a,然后根据项目选择填充a。要粘贴到Rally自定义页面的完整html代码为


    }))

    返回给我的数组中存在重复项,因为我的工作区中存在重复的项目名称。
    在传递到下拉容器时不应包含重复项。

    谢谢,我认为这里面有一个小错误,每次我选择一个新项目时,都会为团队成员创建一个新的下拉框。理想情况下,团队成员应该只有一个下拉列表。另外,您知道为什么我现有的代码不能工作吗?我正在获取
    data
    数组中的数据,并在创建下拉容器时将其添加。谢谢,我添加了一个条件来检查用户选取器是否已存在,如果已存在,则在重新创建之前将其销毁。我没有仔细查看您的代码,因为它使用的是旧的AppSDK 1,而新的AppSDK 2允许在不到50行的情况下构建选择器。根据您的回答,我可以获得基于我选择的当前项目的项目列表吗?目前,我得到了所有项目的列表,无论我目前在哪个项目。我需要根据我的当前项目获取项目的层次结构列表,然后转到分支。如果您所说的“我已选择的当前项目”是指您从项目选择器中选择的项目,那么答案是“是”,您将获得项目的层次结构。这不是一个简单的列表,而是一个真正的项目树。如果您所说的“当前项目”是指您当前所在的项目,那么答案是否定的。无论您所在的项目是什么,选择器都会显示所有工作区和项目。查看自述文件中的屏幕截图。您可以访问当前项目
    Rally.app.Context
    ,从头开始编写自己的项目组合框。
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    <head>
    
    
    <!--App information-->
    <meta name="Name" content="App: TeamApp"/>
    <meta name="Version" content="1.0"/>
    <meta name="Vendor" content=""/>
    
    <!--Include SDK-->
    <script type="text/javascript" src="/apps/1.29/sdk.js"></script>
    
    
    <script type="text/javascript">
    
        var projects_array = new Array();
        var child_project = new Array();
        function onLoad() {
            //Add app code here
    
    
            loadProjectDropdown();
        }
    
        function loadProjectDropdown()
        {
    
            var rallyDataSource = new rally.sdk.data.RallyDataSource("__WORKSPACE_OID__","__PROJECT_OID__","__PROJECT_SCOPING_UP__","__PROJECT_SCOPING_DOWN__");
    
    
            var queryArray = new Array();
             queryArray.push({
                key:"projects",
                type:"project",
                fetch: "Children,Name",
                query: rally.sdk.util.Query('ObjectID = "' + '__PROJECT_OID__' + '"')   
    
                });
    
            rallyDataSource.findAll(queryArray,processQueryArray);
    
        }
    
        function processQueryArray(results){
    
            var data = new Array();
    
            var project = results.projects;
    
            /*
             * 
             * This is just a test from Rohan
             */
            var all_projects = new Array();
            //data.push({label: project[0].Name, value: project[0].Name});
    
            /*if(project[0].Children != null)
            {
                for(var i=0;i<project[0].Children.length;i++)
                {
                    //document.write("Number "+i+" "+project[0].Children[i].Name);
                    data.push({label: project[0].Children[i].Name, value: project[0].Children[i].Name});
                }
            }*/
    
    
            //pass the first parent project to a function that recursively gets all child projects.
    
            all_projects = get_child_recursively(project[0]);   
    
    
            //document.write(JSON.stringify(all_projects));
    
            for(var i=0;i<all_projects.length;i++)
            {
                data.push({label: all_projects[i].Name, value: all_projects[i].Name});
                //document.write(JSON.stringify(all_projects[i]));
                //data.push({label: all_projects[i].Name, value: all_projects[i].Name});
            }
    
            projectDropDown = new rally.sdk.ui.basic.Dropdown({label: "Select Project", items: data, width: 250});
            projectDropDown.display("projectDropDown",projectDropDownChanged);
        }
    
        //Recursive algorithm to get all child projects of a parent project
        function get_child_recursively(parent_project)
        {
    
    
                projects_array.push(parent_project);
    
                if(parent_project.Children.length>0)
                {
                    for(var i=0;i<parent_project.Children.length;i++)
                    {
                        if(child_project.indexOf(parent_project.Children[i])<=-1)
                            child_project.push(parent_project.Children[i]);
                    }
                    for(var i=0;i<child_project.length;i++)
                    {   var temp = child_project[i];
                        child_project.splice(i,1);
                        get_child_recursively(temp);
                    }
                }
                else{
                    return;
                }
    
                if(child_project.length==0 || child_project.length==1){
                    return projects_array;
                }
    
        }      
        function projectDropDownChanged(dropdown,eventArgs){
    
            projectName = eventArgs.value;
    
            //loadTeamMembersDropDown();
    
        }
    
        function loadTeamMembersDropDown(){
    
            var rallyDataSource = new rally.sdk.data.RallyDataSource("__WORKSPACE_OID__","__PROJECT_OID__","__PROJECT_SCOPING_UP__","__PROJECT_SCOPING_DOWN__");
            var rallyqueryObject = {
                key: "projects",
                type: "project",
                fetch: "TeamMembers,Name",
                query: rally.sdk.util.Query('Name = "' + projectName + '"' ),
                order: "Name desc"
            };
    
            rallyDataSource.findAll(rallyqueryObject,processTeamMemberResult);
        }
        function processTeamMemberResult(results){
    
            var teamMember = results.projects;
        }
        rally.addOnLoad(onLoad);
    </script>
            </head>
            <body class="teamApp">
        <table>
        <tr height="50px">
            <td width="300px">
                <div id="projectDropDown"></div>
            </td>                     
        </tr>
        </table>
        </body>  
        </html>
    
    Ext.define('CustomApp', {
    extend: 'Rally.app.App',
    componentCls: 'app',
    
        launch: function() {
            var c = Ext.create('Ext.Container', {
                items: [
                    {
                    xtype: 'rallyprojectpicker',
                        listeners:{
                            change: function(combobox){
                                if (!this.down('#u')) {
                                    this._onProjectSelected(combobox.getSelectedRecord());
                                }
                                else{
                                    Ext.getCmp('u').destroy();
                                    this._onProjectSelected(combobox.getSelectedRecord());
                                }
                            },
                            scope: this
                        }
                    }
                ],
            });
            this.add(c);
        },
    
        _onProjectSelected:function(record){
            var project = record.data['_ref'];
            console.log('project', project);
    
    
            var u = Ext.create('Rally.ui.combobox.UserComboBox',{
                id: 'u',
                project: project,
                listeners:{
            ready: function(combobox){
                                this._onUserSelected(combobox.getRecord());
            },
            select: function(combobox){
                                this._onUserSelected(combobox.getRecord());
            },
            scope: this
        }
            });
            this.add(u);
        },
    
        _onUserSelected:function(record){
            var user = record.data['_ref'];
            console.log('user', user);
        }