emberjs - 添加动作到 Ember.Service

emberjs - Add actions to Ember.Service

我正在尝试向 Ember 1.10 中的 Ember.Service 添加操作,但我必须将 _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 散列:

if (handler._actions && handler._actions[name]) {
  if (handler._actions[name].apply(handler, args) === true) {
    eventWasHandled = true;
  } else {
    return;
  }
}

我想我错过了什么。

动作从模板冒泡到视图,然后是控制器,然后通过路由。除非您手动执行 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() {
    ...
  }
}