2012-05-22 2 views
3

backbone.js와 (확장) underscore.js를 배우려고하는데 일부 규칙을 이해하는 데 어려움을 겪고 있습니다. 이것이 내가 다음에 내 필터 기능을 변경해야 작동하려면, 사실,underscore.js 필터 기능

var search_string = new RegExp(query, "i"); 

     var results = _.filter(this, function(data){ 
      return search_string.test(data.get("title")); 
     })); 

을 :하지만 simpel 검색 필터를 작성하는 동안, 나는 다음과 같은 작업 것이라고 생각

var search_string = new RegExp(query, "i"); 

     var results = _(this.filter(function(data){ 
      return search_string.test(data.get("title")); 
     })); 

기본적으로 두 번째 예제가 작동하는 이유를 이해하고 싶지만 첫 번째 예제는 작동하지 않습니다. 문서 (http://documentcloud.github.com/underscore/#filter)를 기반으로하면 전자가 작동했을 것이라고 생각했습니다. 아니면 어쩌면 이건 내 오래된 jQuery 습관을 반영한 것일뿐입니다.

+0

그것은 _.filter 읽어야

여기에 희망 일을 명확히하는 간단한 데모입니다. _.filter 데이터가 비어 있고 결과적으로 "results"는 빈 배열을 반환합니다. – bento

+0

그리고'this'는 백본 컬렉션입니까? –

+0

그래, 맞아. (이것)의 console.log는 길이, 모형, 등등을 가진 저에게 "아이"를 제공합니다 – bento

답변

4

네이티브 브라우저 Array#filter을 사용하고 있다고 생각합니다. 콘솔에서 이러한 시도하고 어떻게되는지 :

[].filter.call({ a: 'b' }, function(x) { console.log(x) }); 
[].filter.call([1, 2],  function(x) { console.log(x) }); 

첫번째는 아무것도하지 않습니다, 두 번째는 출력 (http://jsfiddle.net/ambiguous/tkRQ3/)로 12를 생성합니다. 문제는 data이 비어 있지 않은 것이지, 문제는 기본이 아닌 Array#filter이 비 어레이 객체에 적용될 때 무엇을해야할지 모르기 때문입니다. 존재하는 경우, 기본 필터 방법

대표 :

(filter 포함) 밑줄의 모든 방법

네이티브 가능한 경우 구현을 사용합니다. 당신이 기본 구현을 제공하지 않는 브라우저를 사용하지 않는

그래서 배열 틱 밑줄 방법은 일반적으로 _.m(collection, ...)으로 작동하지 않습니다.

백본 컬렉션 모델의 배열에 대한 래퍼입니다, 배열 c.models에있는 모델은 그래서 당신은 싶어하는 님의

백본 프록시 :

_.filter(this.models, function(data) { ... }); 

백본에서 collections have several Underscore methods 혼합 Underscore.js에 28 개의 반복 기능을 제공 Backbone.Collection.

이고, 그 중 하나는 filter이다. 이러한 프록시는 컬렉션의 모델 배열에 Underscore 메서드를 적용하므로 c.filter(...)_.filter(c.models, ...)과 같습니다.

이 혼합 인은 아마 밑줄이하고있는 "should I use the native method" 검사 혼란의 새로운 기능 :

if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); 

당신은 평범한 오래된 개체 (_.filter({a:'b'}, ...))에 _.filter를 사용하여 합리적인 결과를 얻을 수 있지만, 때 당신에게 _.filter(backbone_collection, ...) 때문에 실패 콜렉션에는 이미 Underscore 메소드가 있습니다. - 미안 그 오타이었다 http://jsfiddle.net/ambiguous/FHd3Y/1/

+0

이것은 정확하게 나가 찾고 있던 무슨이다. 훌륭한 설명에 감사드립니다. – bento

-1

$('#element')이 작동하고 $#element과 같은 이유 때문입니다. _은 이 jQuery 개체의 전역 변수 인 것처럼 밑줄 개체의 전역 변수입니다.

_()_ 개체의 모양을 말합니다. _filter_filter이라는 메소드를 찾습니다.