Javascript 如何在PortfolioItem/Feature对象上添加发布筛选器

Javascript 如何在PortfolioItem/Feature对象上添加发布筛选器,javascript,rally,appsdk2,Javascript,Rally,Appsdk2,使用AppSDK 2.0,在创建存储时如何查看PortfolioItem/Feature中的“Release”字段 发布需要位于WsapiDataStore中获取的字段中: fetch: ['FormattedID','Name','UserStories','Release'] 但在Rally.data.custom.Store中,为了说明未分配给发行版的功能,使用以下条件: Release: (release && release.Name) || 'None' 代码如下

使用AppSDK 2.0,在创建存储时如何查看PortfolioItem/Feature中的“Release”字段

发布需要位于WsapiDataStore中获取的字段中:

fetch: ['FormattedID','Name','UserStories','Release']
但在Rally.data.custom.Store中,为了说明未分配给发行版的功能,使用以下条件:

Release: (release && release.Name) || 'None'
代码如下:

Ext.define('CustomApp', {
    extend: 'Rally.app.App',
    componentCls: 'app',

    launch: function() {
    Ext.create('Rally.data.WsapiDataStore', {
        model: 'PortfolioItem/Feature',
        fetch: ['FormattedID','Name','UserStories','Release'],
        pageSize: 100,
        autoLoad: true,
        listeners: {
        load: this._onDataLoaded,
        scope: this
        }
    });
    },

    _createGrid: function(features) {
     this.add({
        xtype: 'rallygrid',
        store: Ext.create('Rally.data.custom.Store', {
        data: features,
        pageSize: 100
        }),

        columnCfgs: [
        {
           text: 'Formatted ID', dataIndex: 'FormattedID', xtype: 'templatecolumn',
            tpl: Ext.create('Rally.ui.renderer.template.FormattedIDTemplate')
        },
        {
            text: 'Name', dataIndex: 'Name'
        },
        {
            text: 'Release', dataIndex: 'Release'
        },
        {
            text: 'Story Count', dataIndex: 'StoryCount'
        },
        {
            text: 'User Stories', dataIndex: 'UserStories', 
            renderer: function(value) {
            var html = [];
            Ext.Array.each(value, function(userstory){
                html.push('<a href="' + Rally.nav.Manager.getDetailUrl(userstory) + '">' + userstory.FormattedID + '</a>')
            });
            return html.join(', ');
            }
        }
        ]

    });
    },
    _onDataLoaded: function(store, data){
        var features = [];
        var pendingstories = data.length;
        //debugger;
        Ext.Array.each(data, function(feature) {
                var release = feature.get('Release');
                var f  = {
                FormattedID: feature.get('FormattedID'),
                Name: feature.get('Name'),
                Release: (release && release.Name) || 'None',                             
                _ref: feature.get("_ref"),
                StoryCount: feature.get('UserStories').Count,
                UserStories: []
                };

                var stories = feature.getCollection('UserStories');
               stories.load({
                fetch: ['FormattedID'],
                callback: function(records, operation, success){
                    Ext.Array.each(records, function(story){
                    var number = story.get('DirectChildrenCount');  
                    if (number == 0) {
                        f.UserStories.push({_ref: story.get('_ref'),
                            FormattedID: story.get('FormattedID')
                            });}
                    }, this);

                    --pendingstories;
                    if (pendingstories === 0) {
                    this._createGrid(features);
                    }
                },
                scope: this
                });
                features.push(f);
        }, this);
    }             
});
Ext.define('CustomApp'{
扩展:“Rally.app.app”,
组件CLS:“应用程序”,
启动:函数(){
Ext.create('Rally.data.WsapiDataStore'{
型号:“PortfolioItem/Feature”,
获取:['FormattedID','Name','UserStories','Release'],
页面大小:100,
自动加载:对,
听众:{
加载:这个。加载后,
范围:本
}
});
},
_createGrid:函数(功能){
这个。添加({
xtype:“rallygrid”,
store:Ext.create('Rally.data.custom.store'{
数据:特征,
页面大小:100
}),
专栏CFGS:[
{
text:'Formatted ID',dataIndex:'FormattedID',xtype:'templatecolumn',
tpl:Ext.create('Rally.ui.renderer.template.FormattedIDTemplate')
},
{
文本:“名称”,数据索引:“名称”
},
{
文本:“发布”,数据索引:“发布”
},
{
文本:“故事计数”,数据索引:“故事计数”
},
{
文本:“用户故事”,数据索引:“用户故事”,
渲染器:函数(值){
var html=[];
Ext.Array.each(值、函数(用户故事){
html.push(“”)
});
返回html.join(',');
}
}
]
});
},
_onDataLoaded:函数(存储、数据){
var特征=[];
var pendingstories=data.length;
//调试器;
Ext.Array.each(数据、函数(功能){
var release=feature.get('release');
变量f={
FormattedID:feature.get('FormattedID'),
名称:feature.get('Name'),
Release:(Release&&Release.Name)| |“无”,
_ref:feature.get(“\u ref”),
StoryCount:feature.get('UserStories').Count,
用户故事:[]
};
var stories=feature.getCollection('UserStories');
故事·负载({
获取:['FormattedID'],
回调:函数(记录、操作、成功){
Ext.Array.each(记录、函数(故事){
var number=story.get('DirectChildrenCount');
如果(数字==0){
f、 UserStories.push({u-ref:story.get(''u-ref'),
FormattedID:story.get('FormattedID')
});}
},这个);
--悬而未决;
如果(挂起状态===0){
这是.\u createGrid(功能);
}
},
范围:本
});
特征:推送(f);
},这个);
}             
});