我正在尝试向Ember添加操作。Ember 1.10中的服务,但我不得不将_actions
别名为actions
哈希才能使其工作,我是不是遗漏了什么?
export default Ember.Service.extend(Ember.ActionHandler, {
actions:{
addItem: function(label) {
console.log(label);
}
},
setup: Ember.on('init', function(){
this._actions = this.actions;
})
});
查看ember源,triggerEvent
方法查询_actions
hash:
if (handler._actions && handler._actions[name]) {
if (handler._actions[name].apply(handler, args) === true) {
eventWasHandled = true;
} else {
return;
}
}
我想我错过了什么。
Actions从模板进入视图,然后进入控制器,然后进入路由。除非手动执行myService.send('someAction')
,否则任何操作都不会到达服务。
使用服务方法而不是服务操作。
只需在服务上声明一个方法,然后在控制器中执行(例如):
myService: Ember.inject.service(),
actions: {
someAction: function(arg) {
this.get('myService').someMethod(arg);
}
}
作为一个更简单的解决方案,为了回答dagda1,您可以通过在模板操作上设置目标来跳过中间操作。如果您有一个支持服务的组件,并且可能需要在不同的实例中使用相同的操作,并且希望避免在模板和每个相应的组件中多次声明该操作,那么这将非常有用。
在上下文中注入服务:
myService: inject.service()
以模板中的服务为目标:
{{action 'myServiceAction' target=myService}}
然后,这将针对服务上的操作散列:
actions: {
myServiceAction() {
...
}
}