2013-02-24 65 views
1

我有一個Ember.Select視圖具有一個ArrayController的contentBinding。當我設置的ArrayController的itemController,它突然拋出這個錯誤: 遺漏的類型錯誤:無法調用空的方法「孩子」使用Ember.Select綁定到一個ArrayController,它具有一個itemController

這裏是一個最低限度的例子:

<script type="text/x-handlebars" data-template-name="application"> 
    {{view Ember.Select viewName="select" 
        contentBinding="App.monstersController" 
        optionLabelPath="content.name" 
        optionValuePath="content.id" 
        prompt="Pick a monster:" 
        selectionBinding="App.stateController.selectedMonster"}} 

</script> 

和JavaScript:

window.App = Em.Application.create(); 

App.ApplicationController = Em.Controller.extend({}); 

App.ApplicationView = Em.View.extend({ 
    templateName: 'application' 
}); 

App.data = [{ 
    id: 1, 
    name: "Grog", 
    strength: 10, 
    species: "Troll" 
}, { 
    id: 2, 
    name: "Ognog", 
    strength: 8, 
    species: "Goblin" 
}, { 
    id: 3, 
    name: "Fred", 
    strength: 3, 
    species: "Human" 
}]; 

App.stateController = Em.Controller.create({ 
    selectedMonster: null 
}); 

App.MonsterController = Em.ObjectController.extend({ 
    name: function() { 
     return "Controller Modified " + this.get('name'); 
    }.property('content.name') 
}); 

App.MonstersController = Em.ArrayController.extend({ 
    content: App.data/*, 
    itemController: "monster"*/ 
}); 

App.monstersController = App.MonstersController.create({}); 

這裏是一個小提琴,證明了問題: http://jsfiddle.net/Malkyne/AkHhF/

有沒有人知道這裏發生了什麼,或者我該如何解決?

回答

1

經過很多的搗鼓(哈!),我想我有一個工作的解決方案。以下是步驟:

1.)添加應用程序路線規範來設置控制器。這看起來是這樣的:

App.ApplicationRoute = Ember.Route.extend({ 
    setupController: function() { 
    this.controllerFor('monsters').set('content', App.data); 
    } 
}); 

2)出App.MonstersController取出內容元素,因爲這些內容目前正在路由器分配。現在,它看起來像這樣:

App.MonstersController = Em.ArrayController.extend({ 
    itemController: 'monster' 
}); 

3)從模板中拉出Ember.Select觀點完全是,因爲即使我認爲這種觀點「怪物」,我似乎無法想出一個辦法讓它將其內容綁定到怪物集合。這種替換:

<script type="text/x-handlebars" data-template-name="application">  
    {{render monsters}} 
</script> 

4)現在,讓我們擴展Ember.Select,使我們的新觀點:

App.MonstersView = Ember.Select.extend({ 
    contentBinding: 'this.controller', 
    prompt: "Pick a monster:", 
    selectionBinding: 'App.stateController.selectedMonster', 
    optionLabelPath: 'content.name', 
    optionValuePath: 'content.id' 
}); 

這裏是一個工作小提琴:http://jsfiddle.net/Malkyne/KGJXE/

所以,道德這個故事的最近版本的Ember,在應用程序名稱空間懸擺控制器似乎不太好。如果初始化您的Route setupController函數中的控制器,它們似乎表現得更好。

相關問題