2015-05-25 57 views
2

我的路線是:Emberjs陣列控制器

export default Ember.Route.extend({ 
    model: function (params) { 
     var blocks = this.store.find('block', {'objectId': 777}); 
     this.controllerFor("blocks").set('model', blocks); 
     return Ember.RSVP.hash({ 
      object: this.store.find('object', params.id), 
      blocks: blocks 
     }); 
     //return this.store.find('object', params.id); 
    } 
}); 

我的控制器:

export default Ember.ArrayController.extend({ 
    init: function(e){ 
     alert('jere'); 
    } 
}); 

警報在初始化函數的作品,但接下來我得到的錯誤:

Error while processing route: objects.bc.index Cannot read property 'length' of null TypeError: Cannot read property 'length' of null

什麼通過ajax獲取模型集合的正確方法,並使用自定義數組控制器在模板中顯示它?

+0

這裏是一個完全成熟的示例顯示如何使用帶有vanilla(ish)ajax的ArrayController。 @torazaburo的評論對哈希與數組(模型)是正確的,但是這應該會讓你滾動(這是基於ember-cli的)。 https://github.com/toranb/async-kanban-board-store-example –

回答

1

此代碼有一些問題。首先,ArrayController假定它的模型是一個數組,而你的model鉤子正在返回一個散列。其次,您的this.controllerFor("blocks").set('model', blocks)調用嘗試將控制器的模型設置爲承諾,這是無用的。您不要像這樣在model掛鉤中爲控制器設置模型。您將其設置爲返回模型,然後通過您的(或默認的)setupController鉤子將其安裝(解析後)到控制器中。

你不應該使用ArrayController,它很快就會被棄用,而是使用普通的舊控制器。該控制器的模型將是從model鉤子返回的散列。您需要在{{model}}的模板中明確地訪問它。

所以,你想是這樣的:

// route.js 
export default Ember.Route.extend({ 
    model: function(params) { 
     var blocks = this.store.find('block', {'objectId': 777}); 
     return Ember.RSVP.hash({ 
      object: this.store.find('object', params.id), 
      blocks: blocks 
     }); 
    } 
}); 

// controller.js 
export default Ember.Controller.extend({ 
    init: function(e) { 
     alert('jere'); 
    } 
}); 

在你的模板,而不是

{{#each controller}} 
    blockProp is {{blockProp}} 

,你大概是現在正在做的,用

{{#each block in model.blocks}} 
    blockProp is {{block.blockProp}} 
{{/each}} 
And objectProp is {{model.object.objectProp}} 
+0

'{{#each block as model.blocks}}'應該是'{{#each model.blocks as | block |}}'' –