2013-06-28 57 views
1

解决看板问题时出现问题的问题。我们定制板上的一项功能是列出与卡片内部故事相关的缺陷。通过2.0 API获取缺陷

我曾在2.0p2工作,但同时将我的代码移植到2.0rc1,我似乎无法找回缺陷数组。

我用来调用此:

var defectArray = this.card.getRecord().get("Defects"); 

然后通过它们在典型迭代for循环:

for (var i = 0; i < defectArray.length; i++) { 
    var defect = defectArray[i]; 
    ... 
} 

用于在返回。获得的对象阵列旧API(“缺陷) ,现在它不。

我相信我失去了一些东西,任何帮助将是伟大的!

回答

1

默认情况下,2.0rc1使用新的WSAPI v2.0。出于性能方面的原因,在WSAPI的2.x版本中不再可能这样做。现在每个对象集合都有自己独特的引用。 这意味着现在可以单独查询,分页,排序和过滤这些集合。

获取故事中的缺陷现在将返回一个包含计数和uri的对象,从中检索集合数据。 引用通常是格式/类型/ oid /集合(例如/ hierarchicalrequirement/12345 /缺陷)。

所有记录现在都有一个getCollection方法来检索子集合数据。 此方法将返回一个Rally.data.CollectionStore的实例以处理子集合。

下面的例子演示了如何检索相关缺陷信息在SDK 2.0rc1/2.X WSAPI一个故事:

var defectInfo = story.get('Defects'); 
var defectCount = defectInfo.Count; 

story.getCollection('Defects').load({ 
    fetch: ['FormattedID', 'Name', 'State'], 
    callback: function(records, operation, success) { 
     Ext.Array.each(records, function(defect) { 
      //each record is an instance of the defect model 
      console.log(defect.get('FormattedID') + ' - ' + 
       defect.get('Name') + ': ' + defect.get('State')); 
     }); 
    } 
}); 
+0

谢谢凯尔,这个工作,但是,我希望有更多的顺序答案,这让我不同步,而我的自定义信息写入卡。我将不得不修改一些代码,以允许回调在这一个上工作。标记为正确的,因为这是你现在必须得到缺陷的方式。 – user1537867

+0

是的,我们仍在学习围绕此API的方式。 GA版本的SDK应该支持promise,所以你可以用更同步的风格编写很多这样的异步代码。另外,下面是最近发布的关于WSAPI 2.x集合的指南:http://developer.help.rallydev.com/apps/2.0rc1/doc/#!/guide/collections_in_v2 –

+0

Kyle,这非常有帮助。当我尝试从一个Changeset中取出Artifacts集合时出现问题:'record.getCollection('Artifacts')。load(....'记录作为查询返回到Changeset上,我得到一个'Uncaught指定了无效的模型类型:Artifact'。是否有可能像这样撤回一个通用的Artifacts集合? – 2013-07-02 17:38:54

1

你可以拿回缺陷是这样的:

var defects = story.getCollection('Defects'); 

这里是使用2.0rc1并访问用户故事中的缺陷集合的完整代码。在代码中,我构建了一个网格,但访问该集合的部分有望提供帮助。

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

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

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

     columnCfgs: [ 
      { 
       text: 'Formatted ID', dataIndex: 'FormattedID' 
      }, 
      { 
       text: 'Name', dataIndex: 'Name' 
      }, 
      { 
       text: 'Defect Count', dataIndex: 'DefectCount' 
      }, 
      { 
       text: 'Defects', dataIndex: 'Defects', flex: 1, emptyCellText: 'zero', 
       renderer: function(value) { 
        if (value) { 
         return value.join(','); 
        } 
       } 
      } 
     ] 

    }); 
}, 
_onDataLoaded: function(store, data){ 
      var stories = []; 
      var pendingDefects = data.length; 

      Ext.Array.each(data, function(story) { 
         var s = { 
          FormattedID: story.get('FormattedID'), 
          Name: story.get('Name'), 
          DefectCount: story.get('Defects').Count, 
          Defects: [] 
         }; 

         var defects = story.getCollection('Defects'); 
         defects.load({ 
          fetch: ['FormattedID'], 
          callback: function(records, operation, success){ 
           Ext.Array.each(records, function(defect){ 
            s.Defects.push(defect.get('FormattedID'));  
           }, this); 

           --pendingDefects; 
           if (pendingDefects === 0) { 
            this._createGrid(stories); 
           } 
          }, 
          scope: this 
         }); 
         stories.push(s); 
      }, this); 
}    

});