2013-05-18 7 views
5

Omurga ile oynuyor ve öğrenmeye çalışıyorum. Bu noktada bir süreliğine sıkıştım. Aşağıdaki kodda neyin yanlış olduğunu anlayamıyorum?Bu işlem işlevi neden çalışmıyor?

render: function() { 
    this.$el.empty(); 
    // render each subview, appending to our root element 
    _.each(this._views, function(sub_view) { 
     this.$el.append(sub_view.render().el); // Error on this line 
    }); 

cevap

11

Bağlam sorununuz var. this, aradığınız $el ürününü içermiyor. Uygun this işaret eden bir self değişken bildirerek bunu düzeltebilirsiniz. Aşağıdaki kod sizin için çalışmalıdır.

render: function() { 
    var self = this; //Added this line to declare variable (self) that point to 'this' 
    this.$el.empty(); 
    _.each(this._views, function(sub_view) { 
     self.$el.append(sub_view.render().el); //Used 'self' here instead 'this' 
}); 

Yan Not: omurgasını eğilerek olarak ayrıca belge yeniden akıtma ile çok commong JavaScript sorun hakkında bilmeli. Koleksiyondaki her bir model için bir görünüm oluşturuyorsunuz. Performans sorunlarına ve özellikle eski bilgisayarlarda ve mobil cihazlarda yol açabilir. Kodunuzu, her seferinde DOM'ı güncellemek yerine, container öğesinde her şeyi oluşturarak ve bir kez ekleyerek optimize edebilirsiniz. İşte bir örnek:

render: function() { 
    this.$el.empty(); 
    var container = document.createDocumentFragment(); 
    _.each(this._views, function(sub_view) { 
    container.appendChild(sub_view.render().el) 
    }); 
    this.$el.append(container); 
} 
+0

Mükemmel, harika çalışıyor! Çok teşekkürler ve ayrıca belge akışı sorununu aklımda tutacağım. Gerçekten çok yararlı bilgi! –