在Ember.js中扩展视图或使用mixin

时间:2013-12-24 02:35:24

标签: object view ember.js mixins

我想在Ember应用程序中的多个视图中包含标准功能。该功能包括将视图的tagName和classNames设置为相同并跟踪每个视图的属性。

问题简而言之:我应该使用mixin还是扩展基本视图?

扩展的问题......

是否应该扩展基本视图来执行此操作?例如:

App.BaseView = Em.View.extend({
    tagName: 'section',
    classNames: ['page_section', 'blue'],
    willInsertElement: function() {
        // Some functions called here that set properties
    },
});

App.PageOneView = App.BaseView.extend({
    // View specific stuff here
});

App.PageTwoView = App.BaseView.extend({
    // View specific stuff here
});

...或者,是否应该使用Mixin来扩展功能?例如:

App.BaseMixin = Em.Mixin.create({
    tagName: 'section',
    classNames: ['page_section', 'blue'],
    willInsertElement: function() {
        // Some functions called here that set properties
    },
});

App.PageOneView = Em.View.extend(App.BaseMixin, {
    // View specific stuff here
});

App.PageTwoView = Em.View.extend(App.BaseMixin, {
    // View specific stuff here
});

我理解视图和mixins都是Ember对象,但是使用其中任何一个将标准功能扩展到其他对象(例如视图)会影响对象和原型/实例(如果它们与对象不同)的交互方式以及是否属性是在视图实例或视图对象上设置的吗?

如果上面两个例子不同,那么在mixin的init函数上设置属性会改变什么吗?例如:

App.BaseMixin = Em.Mixin.create({
    tagName: null,
    classNames: null,
    init: function() {
        this.set('tagName', 'section');
        // And so forth...
    },
});

但是,如果使用mixin并扩展视图对视图有相同的影响我试图添加标准功能(也就是说,它们以相同的方式影响视图的对象和原型/实例),你看到使用一个优于另一个优势(无论是在效率,可维护性等方面)?

1 个答案:

答案 0 :(得分:6)

很棒的问题,

简短而简单,扩展视图。

  1. 钩子/绑定是特定于视图的,因此mixin不能应用于控制器,路由等,并且根据您的团队构成,您不希望给某人机会混合代码不属于。

  2. 在Ember中扩展一个类只会将基类变为mixin并将其应用于您的类。 https://github.com/emberjs/ember.js/blob/v1.2.0/packages/ember-runtime/lib/system/core_object.js#L488

  3. 所以它几乎完全相同,只有你的基本视图更有意义,因为它只适用于视图。