2015-03-13 57 views
2

我想在Backbone中定义一个扩展Backbone.View的父视图。所有子视图都将从父视图继承。但是每次我创建一个子视图的新实例时,我都需要在父视图中执行一个函数。下面是一个例子(小提琴是here):始终在Backbone中执行父功能

SimpleSample = {}; 

    SimpleSample.ParentView = Backbone.View.extend({ 

     initialize: function(){ 
      //always execute this 
      console.log('in parent view initialise'); 
     } 
    }); 

    SimpleSample.Child1 = SimpleSample.ParentView.extend({ 

     initialize: function(){ 
      console.log('in child 1 initialise'); 
     } 
    }); 


    SimpleSample.Child2 = SimpleSample.ParentView.extend({ 

    }); 

    SimpleSample.App = function(){ 
     this.start = function(){ 
      var child1 = new SimpleSample.Child1(); 
      var child2 = new SimpleSample.Child2(); 
     } 
    } 

    $(function(){ 
     var app = new SimpleSample.App(); 
     app.start(); 
    }) 

的这个输出是,正如你所期望:

in child 1 initialise 
in parent view initialise 

因为我已经为Child1,在初始化代码(定义初始化() )在ParentView中定义不运行。我不想显式调用每个孩子的ParentView函数。每当有一个从ParentView继承的视图的新实例时,是否有可能总是在ParentView中执行一些代码?

回答

1

你可以重写构造(父视图)

SimpleSample.ParentView = Backbone.View.extend({ 

    initialize: function(options){ 
     //always execute this 
     console.log('in parent view initialise'); 
    } 

    constructor: function (options) { 
     Backbone.View.apply(this, arguments); 
     SimpleSample.ParentView.prototype.initialize.apply(this, options); 
    } 

}); 

这需要关注从Backbone.View调用原始构造函数,并调用初始化函数。

现在你的子视图应该可以自由定义他们自己的初始化函数。

0

在JavaScript中没有真正的超级。

你可以调用父视图明确的功能通过原型对象

SimpleSample.Child1 = SimpleSample.ParentView.extend({ 

    initialize: function(){ 
     console.log('in child 1 initialise'); 
     SimpleSample.ParentView.prototype.initialize.apply(this); 
    } 
}); 

http://jsfiddle.net/yzowyhc5/5/

+0

所以它必须包括在每个子视图? – Mark 2015-03-13 13:59:26

+0

抱歉,我没有正确地阅读你的问题。我认为你的问题是如何从父视图调用一个函数。我不知道是否可以在子视图中自动调用父函数而不显式调用父函数。 – 2015-03-13 14:31:57

2

我们一直在使用Backbone-Super插件一年多。经过充分测试的&易于添加到大多数项目。有了它的子类的初始化会是这个样子:

initialize: function(options) { 
    console.log('in child 1 initialise'); 
    this._super(options); 
} 

它从来没有要求超一流的“自动”,但它可以很容易够到正常拨打电话。它也适用于所有的方法,不仅仅是initialize,所以...

set: function(attributes, options) { 
    this._super(attributes, options); 
    console.log('Child 1 just had "set" called'); 
} 
+0

我认为重点在于OP不希望在每个子类中添加“超级”调用,因为这个问题特别提到*我不想显式调用每个子代的ParentView函数*。 – ivarni 2015-03-14 12:05:42