1

Backbone Todo MVC sourceでは、関数のネイティブのapplyメソッドを使用して を使用せずに Underscore メソッドを呼び出していますが、なぜそれが必要なのかわかりません。

// Filter down the list of all todo items that are finished.
completed: function() {
  return this.filter(function( todo ) {
    return todo.get('completed');
  });
},

// Filter down the list to only todo items that are still not finished.
remaining: function() {
  return this.without.apply( this, this.completed() );
},

withoutの呼び出しは、 filterなどの他の Underscore メソッドと比較して場違いに見えます。バックボーン ソースを再確認して、 Collection オブジェクトに別の方法で混在していないことを確認しました。案の定、そうではありません。

これは、下線メソッドが Collection にアタッチされる方法です。

_.each(methods, function(method) {
  Collection.prototype[method] = function() {
    var args = slice.call(arguments);
    args.unshift(this.models);
    return _[method].apply(_, args);
  };
});

予想どおり - Collection のモデルはすでに最初の引数として渡されています。さらに、メソッドは Collection オブジェクトで呼び出されるため、これは正しくバインドされます。

メソッドを次のように変更してこれを確認しました

this.without(this.completed());

そして、それはうまくいきます。

私はここで何を見落としていますか?

4

2 に答える 2

3

あなたは何も見落としていないと思います。これは への不必要な呼び出しapplyです。おそらく作者は最初に次のように書いたのでしょう(バックボーンの以前のバージョンのためかもしれません)。

// Filter down the list to only todo items that are still not finished.
remaining: function() {
  return _.without.apply( this, this.completed() );
},
于 2013-11-09T01:29:51.467 に答える
2

アンダースコアwithoutは、最初の引数として配列を受け取り、次の引数の配列から除外する値のリストを受け取ります。Backbone の場合、アンダーコア メソッドが動作している配列は、コレクション内のモデルの配列 ( collection.models) であり、除外する値のリストは完了した todo です。だから本質的には

_.without.apply(collection.models, this.completed())

存在しない場合はapply、配列が の 2 番目の引数として渡され、_.without配列から配列を除外しようとします。

_.without(collection.models, [completedTodo1, completedTodo2 /* , etc */]);

ただし、applyでは、完了した todo が個別の引数として渡されます。つまり:

_.without(collection.models, completedTodo1, completedTodo2 /* , etc. */) 

これは、完了した各 todo を除外するために必要なものです。

于 2013-11-09T01:34:50.040 に答える