2012-10-26 22 views
14

Burada eksik bir şey basit olmalı. Backbone/Underscore zinciri yöntemi ile yöntem

http://jsfiddle.net/v9mdZ/

Sadece Omurga ve Altı çizili/loDash öğreniyorum ve chain tanımak için çalışıyorum.

ben gibi çalışır aşağıdaki kod, umuyordum:

var ids = _.pluck(collection.where({'is_checked':true}), 'id'); 

ben şöyle chain kullanarak, bu refactor girişiminde:

var ids = collection.chain().where({'is_checked':true}).pluck('id').value(); 

neden görünmüyor refactored kod çalışmıyor? chain yanlış mı kullanıyorum?

Çözüm (ayrıntılar aşağıdadır)

chain ile where kullanmayın.

cevap

18

some Underscore methods'un koleksiyonlara birleştirilmesi biraz kusurludur. collection.some_mixed_in_underscore_method() derken, koleksiyon belgenizin arkasındaki bazı Kılçık şeylerini istemez, böylece koleksiyonun modelleri içindeki özniteliklere Altçizgi yöntemi uygulanır; bir nevi bu gibi çalışır:

console.log(collection.chain()); 

Eğer chain olduğunu göreceksiniz: böyle çalışmıyor

var ary = _(this.models).map(function(m) { return m.attributes }); 
return _(ary).some_mixed_in_underscore_method(); 

Ama collection.chain(), chain sadece bunu doğrudan eğer öyleyse toplanması en models sarar size bir dizi modeli saran bir nesne veriyor. Modelleriniz bir is_checked özelliğine sahip olmayacaktır (yani model.is_checked yoktur), ancak is_checked özniteliklerine sahip olacaklardır (yani model.get('is_checked') ve model.attributes.is_checked olacaktır). her şeyin ters gittiği yere

Şimdi görebilirsiniz:

collection.chain().where({'is_checked':true}) 

modelleri is_checked özelliklere sahip değildir. Özellikle, is_checked'un true olduğu ve where'dan sonraki her şeyin boş bir diziyle çalıştığı herhangi bir model olmayacaktır.

Artık işlerin yanlara gittiğini biliyoruz, nasıl düzeltiriz? 'Size cenneti Eğer id s ile bunları yaratmadı henüz

collection.chain() 
      .filter(function(m) { return m.get('is_checked') }) 
      .pluck('id') 
      .value(); 

Ama id yok Modellerinizin s ve: Evet, kolayca modeller paketten böylece filter yerine where kullanabilirsiniz id s almak için bir sunucu ile konuştum böylece undefined s geri bir dizi almak için gidiyoruz. Bazı id s eklerseniz:

var collection = new App.OptionCollection([ 
    {id: 1, 'is_checked': true}, 
    {id: 2, 'is_checked': true}, 
    {id: 3, 'is_checked': false} 
]); 

o zaman aradığınız [1,2] alırsınız.

Demo: http://jsfiddle.net/ambiguous/kRmaD/

+0

Mükemmel açıklama. Teşekkürler! Gerçek ortamımda, koleksiyon sunucudan getirilir, böylece kimlikleri vardır. – Bart

+0

'pluck' o model.get (' çağırmaz çünkü çoğu özellik için aynı sorun var) 'ancak bunun yerine modelin niteliklerini doğrudan görünüyor olacaktır. 'id', nesne üzerinde tanımlanan özel bir özelliktir, bu nedenle çalışır, ancak 'is_checked' gibi diğer özellikler 'undefined' değerini döndürür. – Spig

İlgili konular