我正在尝试遵循最佳实践Ember及其潜力,我想到了这个问题,Mixins和服务之间有什么区别以及你如何使用它们?
我有一些服务/混合,工作得很好,但我想确保我做得对。
答案 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使用指向同一个数组。不同的参考值,都指向同一个东西。
服务可以看作是一种可变的共享数据。如果您有一组需要从应用程序的不同部分访问的数据或行为,那么它就是服务的良好候选者。
例如,一个这样的例子就是购物篮。无论您在申请中的哪个位置,都需要参考同一个购物篮才能操纵其数据。