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

Dei*_*eda 7 ember.js

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

我有一些服务/ mixins并且工作得很好,但我想确保我做得对.

loc*_*cks 15

混入是当你想不同的对象具有相同的行为/数据.假设您希望多个控制器触发相同的操作,但更改一个参数:

// 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'
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 对!服务是单件对象. (5认同)
  • 这意味着**服务**在应用程序中的实例是相同的实例吗? (3认同)
  • "但它没有共享,每个都有自己的"......我知道你现在不是在讨论对象文字,但我认为[这篇api文章](https://www.emberjs.com/api/classes/ Ember.Mixin.html)应该在你的回复中提到.它显示了与mixin共享或不共享数据的实现细节. (2认同)