在组件中,为组件提供可选操作非常容易.在组件的JS中我可以写:
if (this.get('someAction')) { this.sendAction('someAction'); }
在我的应用程序路由中,我有一个"通用操作",可以节省我提供带有长动作列表的窗口小部件组件,它看起来像这样:
genericAction: function(customActionName, customActionParams) { this.send(customActionName, customActionParams); }
由于各种原因(包括在某些组件中使用genericAction来触发测试可以订阅的操作,但是应用程序不一定用于某些难以测试的异步/伪装工作流程)我宁愿检查操作是否存在,即:
genericAction: function(customActionName, customActionParams) { if (this.get(customActionName)) { this.send(customActionName, customActionParams); } }
与组件中的方式类似,但这不起作用,也不起作用this.controller.get(customActionName)
.
除了保留硬编码的动作列表之外,我该如何实现这一目标?
如果你将你的行动保留在routes/application.js文件本身,那么代码就是
在Ember 2.0或更高版本中:
if(Em.get(this.actions, actionName)) { this.send(actionName); }
在Ember 1.13
在Ember 1.13中,this.actions未定义,你必须使用this._actions
if(Em.get(this._actions, actionName)) { this.send(actionName); }
如果您需要同时支持Ember 1.x和2.x,请使用以下内容:
let actions = this.actions || this._actions; if(Em.get(actions, actionName)) { this.send(actionName); }
如果你将你的行动保存在应用程序控制器(controllers/application.js)中,那么siva - abc的答案非常有用.