Inheritance 更改backbone.js中继承视图中定义的参数

Inheritance 更改backbone.js中继承视图中定义的参数,inheritance,backbone.js,Inheritance,Backbone.js,我将按以下方式继承一个视图 define('view1', ['backbone', 'jquery', 'subview1'], function(Backbone, $, subview1){ var view1 = Backbone.View.extend({ initialize: function() { //some code with subview1 }, function1: function(){

我将按以下方式继承一个视图

define('view1', ['backbone', 'jquery', 'subview1'], function(Backbone, $, subview1){
    var view1 = Backbone.View.extend({
        initialize: function() {
            //some code with subview1
        },
        function1: function(){
            //some code with subview1
        }
    });
    return view1;
}
儿童观

define('view2', ['backbone', 'jquery', 'view1', 'subview2'], function(Backbone, $, view1, subview2){
    var view2 = view1.extend({
        initialize: function(e) {
            view1.prototype.initialize.apply(this, [e]);
        }
    });
    return view2;
}

我是否可以在子视图中使用subview2而不是subview1,或者需要重写手动使用的所有函数?重要的一点是,view1不能更改,因为它是作为第三方库提供的。

最简单的方法是在考虑可扩展性的情况下构建
view1
。如果将子视图存储在原型中:

var view1 = Backbone.View.extend({
    //...
    subview: subview1
});
var view2 = view1.extend({
    //...
    subview: subview2
});
然后
view1
可以引用
this.subview
而不是
subview1
,子类可以通过原型覆盖
subview
属性:

var view1 = Backbone.View.extend({
    //...
    subview: subview1
});
var view2 = view1.extend({
    //...
    subview: subview2
});
一切都会按预期进行


例如:

您可以使用factory方法模式。您可以将创建子视图的代码分离成一个方法,然后在子类中重写该方法。那你就不必重复你的其他逻辑了

var SubView1 = Backbone.View.extend({
  render: function() {
    this.$el.html('<h1>SubView 1</h1>');
    return this;
  }
});

var SubView2 = Backbone.View.extend({
  render: function() {
    this.$el.html('<h1>SubView 2</h1>');
    return this;
  }
});

var View1 = Backbone.View.extend({
  render: function() {
    var view = this.createSubView();
    this.$el.append(view.render().el);

    return this;
  },

  createSubView: function() {
    return new SubView1();
  }
});

var View2 = View1.extend({
  createSubView: function() {
    return new SubView2();
  }
});
var SubView1=Backbone.View.extend({
render:function(){
这是.$el.html('SubView 1');
归还这个;
}
});
var SubView2=Backbone.View.extend({
render:function(){
这个.$el.html('SubView 2');
归还这个;
}
});
var View1=Backbone.View.extend({
render:function(){
var view=this.createSubView();
这是.el.append(view.render().el);
归还这个;
},
createSubView:函数(){
返回新的子视图1();
}
});
var View2=View1.extend({
createSubView:函数(){
返回新的子视图2();
}
});

谢谢,这是一个很好的方法,但我无法更改视图1,问题已更新。我喜欢您的方法,您应该添加对TOs新要求的响应,并提及您当前的方法,作为从一开始就解决此问题的选项。(+1将获得奖励)这是一个简单的好方法,谢谢,但我不允许更改view1,问题已更新。如果您无法将
view1
更改为子类,那么我认为您运气不好。第三方库是什么?有些库(如木偶)内置了这种功能。这是一个来自客户的自定义视图,应该在我这边重用,可能是出于运气。我在想,如果它是一个开源库,他们会考虑到可扩展性来构建它。如果它是由其他人构建的自定义视图,那么他们可能不是这样构建的。