3

backbone.js と (拡張により) underscore.js を学習しようとしていますが、いくつかの規則を理解するのに苦労しています。単純な検索フィルターを作成しているときに、次のようなものが機能すると思いました。

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

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

しかし、実際には、これを機能させるには、フィルター関数を次のように変更する必要があります。

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

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

基本的に、最初の例が機能しないのに、2 番目の例が機能する理由を理解したいと思います。ドキュメント (http://documentcloud.github.com/underscore/#filter) に基づいて、前者が機能すると思いました。それとも、これは私の古い jQuery の習慣を反映しているだけなのかもしれません... 誰か説明してくれませんか?

4

2 に答える 2

4

Array#filterネイティブ実装のブラウザーを使用していると思います。コンソールでこれらを試して、何が起こるか見てみましょう:

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

最初のものは何もしませんが、2番目のものは1and2を出力として生成します ( http://jsfiddle.net/ambiguous/tkRQ3/ )。data問題は空ではないことです。問題はArray#filter、非配列オブジェクトに適用されたときにネイティブが何をすべきかわからないことです。

Underscore のすべてのメソッド ( を含むfilter) は、可能な場合はネイティブ実装を使用します。

ネイティブフィルターメソッドが存在する場合は、そのメソッドにデリゲートします。

_.m(collection, ...)そのため、ネイティブ実装を提供しないブラウザーを使用していない限り、Array-ish Underscore メソッドは通常は機能しません。

バックボーン コレクションは、モデルの配列のラッパーです。モデル配列が含まれc.modelsているため、次のことを行います。

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

バックボーンコレクションには、複数の Underscore メソッドが混在しています。

Backbone.Collectionで 28 の反復関数を提供するために、BackboneはUnderscore.jsにプロキシします。

それらの1つはですfilter。これらのプロキシは Underscore メソッドをコレクションのモデル配列に適用するためc.filter(...)、 と同じ_.filter(c.models, ...)です。

この混合は、おそらく、Underscore が行っている「ネイティブ メソッドを使用する必要があるか」チェックを混乱させている原因です。

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

_.filter単純な古いオブジェクト ( ) で使用して適切な結果を得ることができますが、コレクションには既に Underscore メソッドがあるため_.filter({a:'b'}, ...)、失敗します。_.filter(backbone_collection, ...)

うまくいけば物事を明確にするための簡単なデモがあります:http://jsfiddle.net/ambiguous/FHd3Y/1/

于 2012-05-22T21:44:27.830 に答える
-1

同じ理由で、機能する場合$('#element')$#element機能しない場合があります。_は、オブジェクトのグローバル変数と同様に、アンダースコア オブジェクト$のグローバル変数ですjQuery

_()オブジェクトを見て言い_ます。_filterという名前のメソッドを探します_filter

于 2012-05-22T20:50:20.883 に答える