2012-10-26 9 views
14

여기에 누락 된 간단한 것이 있어야합니다. 백본/밑줄 체인 방법 (어디에서 방법으로)

http://jsfiddle.net/v9mdZ/

난 그냥 백본 및 밑줄/loDash을 배우고 및 chain에 익숙해하려합니다.

는 I는 다음과 같이 작동합니다 다음 코드는 예상 한 :

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

내가 지금처럼 chain를 사용하여,이 리팩토링을 시도 :

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

하지 않는 이유는 무엇 리팩토링 코드를 사용할 수 있습니까? chain을 잘못 사용하고 있습니까?

솔루션 (자세한 내용은 아래 참조)

chainwhere를 사용하지 마십시오.

답변

18

some Underscore methods을 컬렉션에 병합하는 것은 약간 불완전합니다. collection.some_mixed_in_underscore_method()이라고 말하면, 콜렉션의 모델 안의 애트리뷰트에 언더 스코어 (Underscore) 메소드가 적용되도록 콜렉션이 등 뒤에서 백본의 일부를 푸십시오. 그것은 일종의 다음과 같이 작동

console.log(collection.chain()); 

당신이 chain는 것을 볼 수 있습니다 : 그런 식으로 작동하지 않습니다

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

그러나 collection.chain()chain은 이렇게 직접 그래서 만약 컬렉션의 models 랩 일련의 모델을 래핑하는 객체를 제공합니다. 모델에 is_checked 속성이 없으므로 (model.is_checked이 없음) is_checked 개의 속성이 있습니다 (즉, model.get('is_checked')model.attributes.is_checked이 있음). 모든 잘못 곳

이제 우리는 볼 수 있습니다

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

모델은 is_checked 속성이 없습니다. 특히 is_checkedtrue이고 where 이후의 모든 항목이 빈 배열로 작업하는 모델은 없습니다.

이제 우리는 어디로 가는지 알았으니 어떻게 수정해야합니까? '당신의 천국 당신이 id의로를 작성하지 않은으로 아직

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

그러나, id이없는 당신의 모델이 S와 : 글쎄, 당신은 쉽게 모델을 풀 수 있도록 filter 대신 where을 사용할 수 있습니다 t는 서버에 접속하여 id을 얻었으므로 undefined 어레이를 다시 가져올 것입니다. 당신은 몇 가지 id의 추가하는 경우 :

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

을 당신은 당신이 찾고있는 [1,2]를 얻을 수 있습니다.

데모 : http://jsfiddle.net/ambiguous/kRmaD/

+0

우수 설명. 감사! 제 실제 환경에서는 컬렉션이 서버에서 가져 오므로 ID가 있습니다. – Bart

+0

'pluck'는'model.get()'을 호출하지 않고 대신 모델의 속성을 직접 보았기 때문에 대부분의 애트리뷰트에서 동일한 문제를 갖습니다. 'id'는 객체에 정의 된 특별한 속성이므로 작동 할 수 있지만 is_checked와 같은 다른 속성은'undefined'를 반환합니다. – Spig