在Backbone中进行视图混合的正确方法

Mau*_*ord 58 backbone.js

我一直在扩展基础骨干视图,并且每个部分都有一个基本视图,以便我可以在多个级别上进行扩展.我的问题是,查看混合的最有效方法是什么:可以混合到任何视图中的可重用视图部分.例如:

var BaseProfile = Backbone.View.extend({ ...});
var UserProfile = BaseProfile.extend({ ...});
var VideoSupport = Backbone.View.extend({ ...});
Run Code Online (Sandbox Code Playgroud)

VideoSupport视图(事件对象和一些方法)与UserProfile视图混合的最佳方法是什么?

Der*_*ley 111

underscore.js库提供了一个执行所需操作的extend方法.您可以在任何对象上定义功能,然后将该对象的所有方法和属性复制并粘贴到另一个对象.

Backbone extend在Views,Models和Routers上的方法是下划线的包装extend.

 var MyMixin = {
  foo: "bar",
  sayFoo: function(){alert(this.foo);}
}

var MyView = Backbone.View.extend({
 // ...
});

_.extend(MyView.prototype, MyMixin);

myView = new MyView();
myView.sayFoo(); //=> "bar"
Run Code Online (Sandbox Code Playgroud)

  • 感谢Derek,我认为_.defaults更合适,因此mixin视图属性和方法不会覆盖.但是,如果mixin会扩展它所混合的"类"的事件和init函数,那么它是什么样的.另外在你的例子中你不会扩展MyView.prototype而不是MyView函数类吗? (5认同)
  • 这是要走的路,但是有一点需要注意,你通常要扩展原型. (3认同)
  • +1关于使用_.defaults而不是_.extend的评论.有人提醒人们可能不理解Derick正在做什么,因为默认值是一个广为人知的功能. (2认同)

小智 19

我可能会建议使用Backbone.Cocktail,它提供了一种非常简洁的方法来指定mixins(尊重继承):

var Mixin = {
  initialize: function() {
    console.log("I'll be called as well as the class's constructor!");
  }
};

var View = Backbone.View.extend({
  mixins: [ MyMixin ]
});
Run Code Online (Sandbox Code Playgroud)

我在这篇博文中详细介绍了它.