ここにいるカップル可能性の
1.集中:店舗TuneBook
インスタンスでClosedTune
オブジェクト
ストアtune_book.tunes
各ClosedTune
を参照。 tune_book.tunes
の人口はあなた次第です。 TuneBook
の加算メソッドについて述べたので、これを以下に示します。 TuneBook
イベントハンドラで
、キーとしてイベントターゲットのid
属性のようなものを使用してtune_book.tunes
からClosedTune
を取得します。その後、Tune
またはClosedTune
ハンドラを呼び出します。
http://jsfiddle.net/p5QMT/1/
var Tune = Backbone.View.extend({
className: "tune",
click_handler: function (event) {
event.preventDefault();
console.log(this.id + " clicked");
},
render: function() {
this.$el.html(
'<a href="" class="button">' + this.id + '</a>'
);
return this;
}
});
var ClosedTune = Tune.extend({});
var OpenTune = Tune.extend({
events: {
"click .button" : 'click_handler'
}
});
var TuneBook = Backbone.View.extend({
events: {
"click .tune .button" : 'click_handler'
},
click_handler: function (event) {
var tune = this.options.tunes[
$(event.target).closest(".tune").attr('id')
];
tune.click_handler(event);
},
add_tune: function (tune) {
this.options.tunes[tune.id] = tune;
this.$el.append(tune.render().el);
},
render: function() {
$("body").append(this.el);
return this;
}
});
var tune_book = new TuneBook({
tunes: {}
});
[1, 2, 3].forEach(function (number) {
tune_book.add_tune(new ClosedTune({
id: "closed-tune-" + number
}));
});
tune_book.render();
var open_tune = new OpenTune({
id: "open-tune-1"
});
$("body").append(open_tune.render().el);
2.分散:あなたはClosedTune
を作成すると、例えば、それへの参照を格納し、jQuery.data()
を使用してDOMオブジェクトとビューオブジェクトを関連付けますthis.$el.data('view_object', this)
。
イベントリスナーでは、ClosedTune
を取得します。 $(event.target).data('view_object')
。
したい場合は、(TuneBook
に)ClosedTune
のためにまったく同じハンドラを使用してOpenTune
ことができます。
http://jsfiddle.net/jQZNF/1/
var Tune = Backbone.View.extend({
className: "tune",
initialize: function (options) {
this.$el.data('view_object', this);
},
click_handler: function (event) {
event.preventDefault();
var tune =
$(event.target).closest(".tune").data('view_object');
console.log(tune.id + " clicked");
},
render: function() {
this.$el.html(
'<a href="" class="button">' + this.id + '</a>'
);
return this;
}
});
var ClosedTune = Tune.extend({
initialize: function (options) {
this.constructor.__super__.initialize.call(this, options);
}
});
var OpenTune = Tune.extend({
events: {
"click .button" : 'click_handler'
}
});
var TuneBook = Backbone.View.extend({
events: {
"click .tune .button": Tune.prototype.click_handler
},
add_tune: function (tune) {
this.$el.append(tune.render().el);
},
render: function() {
$("body").append(this.el);
return this;
}
});
var tune_book = new TuneBook({
tunes: {}
});
[1, 2, 3].forEach(function (number) {
tune_book.add_tune(new ClosedTune({
id: "closed-tune-" + number
}));
});
tune_book.render();
var open_tune = new OpenTune({
id: "open-tune-1"
});
$("body").append(open_tune.render().el);
コメントへの応答私はオプション1を検討したが、私はすでにtunebookにチューンモデルのコレクションを持っていると私は「別のオブジェクトをしたくなかったとして、それに対して決定私はそれはあなたがする必要性を感じ、そしてなぜ、ハウスキーピング/同期の種類によって異なると思い同期
を維持する必要がありますdが。
(例:TuneModel.remove()では、チューンブックのリストからビューを削除する必要があります。イベントを行うにはイベントが必要なので、イベントのみのソリューションがより魅力的になり始めます)。
は、なぜあなたは、「ビューのtunebookのリストからビューを削除する必要がある」と感じています? (私はあなたがするべきではないと示唆しているわけではありません。なぜあなたはが欲しいですか?)あなたはそうしているので、@ ggozadのアプローチはその点でどのように違うと思いますか?
どちらのテクニックも、TuneBook
インスタンスにClosedTune
オブジェクトを格納します。 @ ggozadのテクニックでは、抽象化の背後に隠れているので、おそらくそれはあなたにはあまり明らかになりません。
私の例では、それらはプレーンなJSオブジェクト(tune_book.tunes
)に格納されています。 @ ggozadでは、Backbone.Events
によって使用される_callbacks
構造体に格納されます。
ClosedTune
の追加:
1.
this.options.tunes[tune.id] = tune;
2.
this.on('buttonClick:' + tune.id, tune.handler, tune);
あなたはClosedTune
を取り除きたい場合は(あなたがtune.remove()
で文書からそれを削除して言いますビューオブジェクトを完全に消したい場合)、@ ggozadの手法を使用すると、ClosedTune
iへの孤立した参照が残されますあなたは、私が提案したアプローチで理にかなって、ハウスキーピングの同じ種類を実行しない限り、nはtune_book._callbacks
:
1.
delete this.options.tunes[tune.id];
tune.remove();
2.
this.off("buttonClick:" + tune.id);
tune.remove();
各例の最初の行はオプションです - ClosedTune
オブジェクトをクリーンアップするかどうかによって異なります。
オプション2は、私が今やっていることに多少なりとも関係していますが、(他の理由で)モデルをデータ属性としてビューに保存することもできます。場所全体の参照を格納するよりも良い方法になるはずです。
まあ、それは最終的に物事を構成する方法の好みになります。より集中的にビューオブジェクトを格納することをお望みなら、jQuery.data
の代わりにTuneBook
インスタンスに格納することができます。 #1:集中を参照してください。 jQuery.data
を使用して、またはTuneBook
にプレーンオブジェクトで、またはTuneBook
で_callbacks
中:
一つの方法または別のあなたがClosedTune
オブジェクトへの参照を保存しています。
あなたが理解している理由で@ ggozadのアプローチが好きなら、それを試してみてください。しかしそれは魔法ではありません。ここで紹介しているように、#1で提示したより単純なバージョンと比べて、抽象度のレベルが上がったことによってどのような利点が得られるはずです。
'' Tune'モデルでハンドラーによってイベントが実行されるのであれば、 '' ChildView - > ParentView - > Model' ..という迂回路を作りたいのであれば、 '' ChildView'から 'Model.handler'を直接実行することができます。 ..もう一方では、 'Model'をメッセンジャーとして使うことができます:ChildViewからモデルの状態を変更し、ParentViewにこの変更を聞かせることができます。 – fguillen
@fguillen親ビューのDOMノードに1回ではなく、各子ビューのDOMノードに、イベントをバインドする方が効率的ではありません(おそらく、バックボーンのカスタムイベントではなくDOMイベントを意味するはずです)。私のアプリのパフォーマンスによって生成された300行のテーブルでは、各行に直接バインドするときには目立って鈍いです。 'ParentView - > [childView] - > childModel' – wheresrhys