2015-03-13 77 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