2013-04-13 24 views
7

Ho un tre Backbone Vedi ereditarietà di classe:Backbone View eredità - genitore chiamata conduce alla ricorsione

var preventRecursion = 0; 

var parentView = Backbone.View.extend({ 

    initialize: function(){ 
    console.log('parentView'); 
    } 
}); 

var nestedChildView = parentView.extend({ 

    initialize: function(){ 

    if (++preventRecursion == 5) {throw "Recursion"}; 

    console.log('nestedChildView'); 
    this.constructor.__super__.initialize.apply(this);   
    } 
}); 

var nestedNestedChildView = nestedChildView.extend({ 

    initialize: function(){ 
    console.log('nestedNestedChildView'); 
    this.constructor.__super__.initialize.apply(this);   
    } 
}); 

Quando cerco di creare nestedNestedChildView:

var t = new nestedNestedChildView(); 

ottengo ricorsione infinita: Ecco jsfiddle

risposta

13

Come indicato nel documento Model.extend,

Breve commento su super: JavaScript non fornisce un modo semplice per chiamare super - la funzione con lo stesso nome definita più in alto sulla catena del prototipo . Se si sostituisce una funzione fondamentale come insieme, o salvare, e si desidera invocare realizzazione dell'oggetto principale, dovrete esplicitamente chiamarlo, in questo senso:

nella gerarchia di classe, this.constructor sempre equivale al costruttore di nestedNestedChildView, che significa this.constructor.__super__.initialize sarà nestedChildView.initialize e quindi un ciclo. Vedi http://jsfiddle.net/X5yBb/ per un test.

Si potrebbe chiamare in modo esplicito il __super__ classe (http://jsfiddle.net/X5yBb/1/)

var nestedChildView = parentView.extend({ 
    initialize: function(){ 
    console.log('nestedChildView'); 
    nestedChildView.__super__.initialize.apply(this);   
    } 
}); 

var nestedNestedChildView = nestedChildView.extend({ 
    initialize: function(){ 
    console.log('nestedNestedChildView'); 
    nestedNestedChildView.__super__.initialize.apply(this);   
    } 
}); 

o chiamare i metodi sulla catena di prototipi, se si preferisce (http://jsfiddle.net/X5yBb/2/):

var nestedChildView = parentView.extend({ 
    initialize: function(){ 
    console.log('nestedChildView'); 
    parentView.prototype.initialize.apply(this);   
    } 
}); 

var nestedNestedChildView = nestedChildView.extend({ 
    initialize: function(){ 
    console.log('nestedNestedChildView'); 
    nestedChildView.prototype.initialize.apply(this);   
    } 
}); 

Vedi Accessing parent class in Backbone e Super in Backbone per ulteriori informazioni a questo proposito.

+0

Grazie per la risposta. – Erik

Problemi correlati