在Emberjs上Mixins和Services之间有什么区别

时间:2016-02-08 12:08:56

标签: ember.js

我正在尝试遵循最佳实践Ember及其潜力,我想到了这个问题,Mixins和服务之间有什么区别以及你如何使用它们?

我有一些服务/混合,工作得很好,但我想确保我做得对。

1 个答案:

答案 0 :(得分:15)

mixin 是指您希望不同的对象具有相同的行为/数据。假设您希望多个控制器触发相同的操作,但更改一个参数:

// app/mixins/change-name.js
export default Ember.Mixin.create({
  actions: {
    changeName(item) {
      item.set('name', this.get('name'));
    }
  }
});

// app/controllers/some-controller
import ChangeName from '<app-name>/mixins/change-name';

export default Ember.Controller.extend(ChangeName, {
  name: 'Some Controller'
});

请注意,控制器将具有相同的操作,但它不共享,每个都有自己的操作。您还可以从对象本身扩展mixins,因为它们已添加到_super()链。

需要记住的是,像数组这样的原始引用数据类型仍然通过引用传递。因此,如果您有一个具有数组属性的Mixin,请确保在每次使用Mixin时在数组上使用Ember.computed来创建新实例。否则,只需使用通用[]将导致所有Mixin使用指向同一个数组。不同的参考值,都指向同一个东西。

服务可以看作是一种可变的共享数据。如果您有一组需要从应用程序的不同部分访问的数据或行为,那么它就是服务的良好候选者。

例如,一个这样的例子就是购物篮。无论您在申请中的哪个位置,都需要参考同一个购物篮才能操纵其数据。