SOや他の場所への投稿からの推奨事項に従っていますが、これを機能させることができません。
すべてのモデルが削除された後に「削除された」イベントを発生させるために、すべてのバックボーンコレクションの削除機能をオーバーライドしたいと思います。
私はこれを試しました:ここをいじる
Backbone.Collection.prototype.remove = function(models, options){
console.log('removing');
Backbone.Collection.prototype.remove.call(this, models, options);
this.trigger('removed', models);
};
var MyColl = Backbone.Collection.extend({ });
var MyModel = Backbone.Model.extend({ });
var myColl = new MyColl();
var myModel = new MyModel();
myColl.add(myModel);
myColl.remove(myModel);
...しかし、それ自体を再帰的に呼び出しているように見え、親(ベース)のremoveメソッドを起動することはありません。
removeメソッドを正しくオーバーライドしてbaseメソッドを呼び出すにはどうすればよいですか?
私のお気に入りの方法はwrap()
、アンダースコアを使用することです。特に、アンダースコアはデフォルトでバックボーンで使用できるためです。私は個人的に使用を楽しんでいます。wrap()
なぜなら、次のように、何が起こっているのかがわかりやすい英語で明らかになるからです。
Backbone.Collection.prototype.remove = _.wrap(
Backbone.Collection.prototype.remove,
function(original_remove, models, options) {
// Capture original function arguments
var original_args = Array.prototype.splice.call(arguments, 0, 1);
// Before
console.log('removing');
// Call original function with original arguments
original_remove.apply(this, original_args);
// After
this.trigger('removed', models);
});
唯一の注意点は、Array.prototype.splice
最初のパラメーター(アンダースコアが元の関数に設定する)を取り除く呼び出しです。ただし、これによりapply()
、元の引数で使用できるようになります。これは、call()
明示的に名前を付ける必要がなく、任意の数の引数を処理するため、少し柔軟性があります。
Array.prototype.splice
ではなくの使用に注意してくださいarguments.splice()
。これはarguments
、完全なJavascript配列型ではなく、独自のプロトタイプでspliceメソッドを実行しないために必要です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加