2013-06-28 33 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); 
}    

});