2013-07-12 21 views
1

我有這個jsbin。我的問題是,我試圖觸發action如何從模板觸發控制器上的動作

​​

但我得到一個:

Uncaught Error: Nothing handled the event 'controllers.nodesIndex.destroyAllRecords' 

(你可以觸發通過按下右上角的小圖標icon-remove-circle,並檢查JS的控制檯上的錯誤)

但我的控制器正確設置:

App.NodesIndexController = Ember.ArrayController.extend({ 
    destroyAllRecords: function() { 
     console.log('destroyAllRecords called'); 
    }, 
}); 

我在這裏錯過了什麼?

+0

感謝。您的評論有效,只是*因爲*我把jsbin放在一起時犯了一個錯誤。我現在更新了jsbin以顯示我的真實實現:更改是我試圖觸發'nodes'模板中的操作,而不是'nodes/index'模板中的操作,因爲這是所有節點出口的通用部分。但是'節點'模板中既沒有'controllers.nodesIndex.destroyAllRecords'也沒有'destroyAllRecords'。我能做些什麼來從'nodes'模板觸發該方法? – dangonfast

+0

你必須在yor'nodes'控制器中放入'needs:['nodesIndex']' – Hyder

回答

2

由於控制器爲nodes/index模板是App.NodesIndexController,你需要提到它爲controllers.nodesIndex.destroyAllRecords,默認目標將是App.NodesIndexController,所以你只能說<a {{action destroyAllRecords}}>爲@Thomas說。

也用於獲取記錄的長度,只需說{{this.length}}而不是{{controllers.nodesIndex.length}}

我已經更新了你的jsbin

你需要說的那樣'controllers.controllername.methodname'只有當你指的是一些其他的控制器比控制器的模板,你已經給控制器的名稱中的需求清單, 說,如果你想從你的「節點/索引」模板調用你的「個人資料」路線的方法,然後

App.NodesIndexController = Ember.ArrayController.extend({ 
    needs: ['profile'], 
}); 

,並在您的模板,

<a {{action controllers.profile.methodname}}> 

希望它有幫助。

UPDATE:請參考解決方案和料倉的評論

+0

謝謝,你讓我走上了正確的軌道。但如果不足以定義「需求」。我還需要添加到'NodesController'下面:'destroyAllRecords:function(){var nodesIndexController = this.get('controllers.nodesIndex'); nodesIndexController.destroyAllRecords(); }'然後我可以在節點模板中調用'{{action destroyAllRecords}}'。執行'{{action controllers.nodesIndex.destroyAllRecords}}'不起作用,即使在定義'needs'之後。這看起來很複雜:我必須定義兩次'destroyAllRecords'。我想知道是否有辦法簡化這一點。 – dangonfast

+0

It shou; d've been'a {{action destroyAllRecords this target ='controllers.nodesIndex'}}',我更新了你的[jsbin](http://jsbin.com/ebagad/1#/nodes/指數)。 在這種情況下,您可以簡單地將'nodesRoute'中的動作定義爲'nodesController','nodesIndexContrller'和'nodesRoute'的所有子路由的事件都會冒泡到它,除非您明確需要'nodesIndexController '。 – Hyder

相關問題