Ember.js 如何从模板触发控制器上的操作

Ember.js 如何从模板触发控制器上的操作,ember.js,Ember.js,我有这个。我的问题是,我试图触发一个操作: <a {{action controllers.nodesIndex.destroyAllRecords this}}><i class="icon-remove-circle"></i><a/> (您可以通过按下右上角的小图标icon remove circle并在js控制台上检查错误来触发此操作) 但我的控制器设置正确: App.NodesIndexController = Ember.ArrayC

我有这个。我的问题是,我试图触发一个
操作

<a {{action controllers.nodesIndex.destroyAllRecords this}}><i class="icon-remove-circle"></i><a/>
(您可以通过按下右上角的小图标
icon remove circle
并在js控制台上检查错误来触发此操作)

但我的控制器设置正确:

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

这里缺少什么?

由于
节点/索引
模板的控制器是
App.NodesIndexController
,您需要将其命名为
controllers.nodesIndex.destroallrecords
,默认目标将是
App.NodesIndexController
,因此您可以说

仅当您引用的是模板的控制器以外的其他控制器,并且您必须在需要列表中提供控制器的名称时,才需要说as
“controllername.methodname”
, 比方说,如果您想从“节点/索引”模板调用“概要文件”路由的方法, 然后

在你的模板中

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

希望能有帮助


更新:参考注释中的解决方案和bin

应该做一些小动作。你的评论奏效了,只是因为我在整理jsbin时犯了一个错误。现在我已经更新了jsbin以显示我的实际实现:更改是我试图在
节点
模板中触发操作,而不是在
节点/索引
模板中,因为这是所有节点的公共部分。但是从
节点
模板中,既找不到
控制器.nodesIndex.destroallrecords
也找不到
destroallrecords
。如何从
节点
模板触发该方法?您必须将
需求:['nodesIndex']
放在您的
节点
控制器中。谢谢,您让我走上了正确的轨道。但是如果不足以定义
需求
。我还需要向
节点控制器添加以下内容:
销毁所有记录:函数(){var nodesIndexController=this.get('controllers.nodesIndex');nodesIndexController.destroyAllRecords();}
,然后我可以在节点模板中调用
{action destroallrecords}
。即使在定义了
需求之后,执行
{{action controllers.nodesIndex.destroyAllRecords}}
也不起作用。这看起来很复杂:我必须定义
destroyAllRecords
两次。我想知道是否有一种方法可以简化这个过程;如果已经
a{{action destroallrecords this target='controllers.nodesIndex'}}
,我已经更新了您的。在这种情况下,您可以简单地将
nodesRoute
中的操作定义为
nodesController
的事件,
nodesIndexController
nodesRoute
的所有子路由的事件将冒泡到它上面,除非您在
nodesIndexController
中明确需要该事件。
App.NodesIndexController = Ember.ArrayController.extend({
    needs: ['profile'],
});
<a {{action controllers.profile.methodname}}>