emberjs - 向Ember.Service添加操作

时间:2015-03-07 09:42:02

标签: ember.js

我试图在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;
  }
}

我想我错过了什么。

2 个答案:

答案 0 :(得分:6)

操作从模板冒泡到视图,然后是控制器,然后通过路径。除非您手动执行myService.send('someAction')

,否则任何操作都无法访问服务

使用服务方法代替服务操作。

只需在服务上声明一个方法,然后在控制器中执行:

  myService: Ember.inject.service(),
  actions: {
    someAction: function(arg) {
      this.get('myService').someMethod(arg);
    }
  }

答案 1 :(得分:0)

作为一个更简单的解决方案并回答dagda1,您可以通过在模板操作上设置目标来跳过中间操作。如果您有一个服务支持的组件并且需要在各种实例中使用相同的操作并且希望避免必须多次在模板和每个相应组件中声明操作,这将非常有用。

在上下文中注入服务:

myService: inject.service()

在模板中定位服务:

{{action 'myServiceAction' target=myService}}

然后,这将针对服务上的操作哈希:

actions: {
  myServiceAction() {
    ...
  }
}