2013-04-11 20 views
6

Backbone.js ile başlıyorum ve ilk örnek uygulama alışveriş listesini oluşturmaya çalışıyorum.Backbone.js - getirme yöntemi sıfırlama olayını tetiklemiyor

Sorun, öğelerin koleksiyonunu aldığımda, sıfırlama olayının muhtemelen tetiklenmediğidir, bu nedenle render yöntemim çağrılmıyor.

Modeli:

Item = Backbone.Model.extend({ 
    urlRoot : '/api/items', 
    defaults : { 
    id : null, 
    title : null, 
    quantity : 0, 
    quantityType : null, 
    enabled : true 
    } 
}); 

Koleksiyonu:

ShoppingList = Backbone.Collection.extend({ 
    model : Item, 
    url : '/api/items' 
}); 

Liste görünümü:

ShoppingListView = Backbone.View.extend({ 

el : jQuery('#shopping-list'), 

initialize : function() { 
    this.listenTo(this.model, 'reset', this.render); 
}, 

render : function (event) { 
    // console.log('THIS IS NEVER EXECUTED'); 
    var self = this; 
    _.each(this.model.models, function (item) { 
     var itemView = new ShoppingListItemView({ 
      model : item 
     }); 
     jQuery(self.el).append(itemView.render().el); 
    }); 
    return this; 
} 

}); 

Liste öğesi görünümü:

ShoppingListItemView = Backbone.View.extend({ 

tagName : 'li', 

template : _.template(jQuery('#shopping-list-item').html()), // set template for item 

render : function (event) { 
    jQuery(this.el).html(this.template(this.model.toJSON())); 
    return this; 
} 

}); 

Yönlendirici: sayfa yüklemesi sonrasında

var app = new AppRouter(); 
Backbone.history.start(); 

, kalemlerin toplanması sunucusundan doğru getirilen ancak render:

var AppRouter = Backbone.Router.extend({ 

routes : { 
    '' : 'show' 
}, 

show : function() { 
    this.shoppingList = new ShoppingList(); 
    this.shoppingListView = new ShoppingListView({ 
     model : this.shoppingList 
    }); 
    this.shoppingList.fetch(); // fetch collection from server 
} 

}); 

Uygulama açılışı AlışverişListView yöntemi asla denir. Ne yapıyorum yanlış? , Backbone Docs

Yani:

"sunucudan modeli veri döner, bu ayarlı kullanır zaman geçmesi sürece (akıllı) getirilen modeller birleştirme {gerçek sıfırlama:}"

cevap

26

İşte senin sorunun Eğer a collection attribute on a view tanımlayabilir, bir kenara olarak

this.shoppingList.fetch({reset:true}); // fetch collection from server 

: sıfırlama seçeneğinin getirme basar mısın

this.shoppingList = new ShoppingList(); 
    this.shoppingListView = new ShoppingListView({ 
    collection : this.shoppingList // instead of model: this.shoppingList 
    }); 
+0

Onun desenine katılmasanız bile, burada yanlış bir şey yok. Onun * modeli * bir koleksiyon, tamam, ama onun görüşü onu dinler. Nereye gittiğini anlamıyorum. – Loamhoof

+0

@Loamhoof hm, iyi yakalama.Cevabımı güncelledim –

+1

Çok teşekkür ederim! '{reset: true}', benim sorunumun anahtarıydı. – chr1s

1

Backbone 1.0 kullanıyor musunuz? Aksi takdirde, bunu göz ardı edin, aksi halde, doktorun Collection#fetch yöntemiyle ilgili ne söylediğini ilginç bulabilirsiniz.

changelog alıntı:

"Yeniden adlandırılmış Collection 'güncelleme' Benzer model.set() ve reset ile kontrast paralellik için, ayarlamak Şimdi bir Eğer andan sonraki varsayılan güncelleme mekanizması.. Eğer geçmek, "reset" kullanmaya devam etmek istiyorum {reset: true} "

Yani temelde, bu nedenle hiçbir reset olay tetiklenir burada reset ama bir update, yapmıyoruz.

+0

Evet, Backbone 1.0 kullanıyorum. – chr1s

İlgili konular