2013-04-13 33 views
7

Tôi có một ba Backbone Xem lớp thừa kế:Backbone Xem thừa kế - gọi cha mẹ dẫn đến đệ quy

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);   
    } 
}); 

Khi tôi cố gắng tạo ra nestedNestedChildView:

var t = new nestedNestedChildView(); 

tôi nhận đệ quy vô hạn: Dưới đây là jsfiddle

Trả lời

13

Như đã nêu trong tài liệu trên Model.extend,

Ngắn gọn sang một bên: JavaScript không cung cấp cách đơn giản để gọi siêu - chức năng cùng tên được xác định cao hơn trên chuỗi nguyên mẫu. Nếu bạn ghi đè một chức năng cốt lõi như bộ, hoặc tiết kiệm, và bạn muốn để gọi thực hiện các đối tượng của cha mẹ, bạn sẽ phải rõ ràng gọi nó, cùng những dòng này:

Trong hệ thống cấp bậc lớp học của bạn, this.constructor luôn bằng với hàm tạo của nestedNestedChildView, có nghĩa là this.constructor.__super__.initialize sẽ là nestedChildView.initialize và do đó là một vòng lặp. Xem http://jsfiddle.net/X5yBb/ để kiểm tra.

Bạn rõ ràng có thể gọi lớp __super__ (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);   
    } 
}); 

hoặc gọi các phương pháp trên chuỗi nguyên mẫu nếu bạn thích (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);   
    } 
}); 

Xem Accessing parent class in BackboneSuper in Backbone để biết thêm Về chủ đề này.

+0

Cảm ơn bạn đã trả lời. – Erik

Các vấn đề liên quan