ここにいくつかの可能性があります。
1.一元化:ClosedTune
オブジェクトをTuneBook
インスタンスに保存します
それぞれへの参照をに格納しClosedTune
ますtune_book.tunes
。どのように入力するかtune_book.tunes
はあなた次第です。で加算器メソッドについて言及したのでTuneBook
、それを以下に示します。
TuneBook
イベントハンドラーで、イベントターゲットの属性などをキーとして使用してfromを取得ClosedTune
します。次に、またはハンドラーを呼び出します。tune_book.tunes
id
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.分散型:を使用してビューオブジェクトをDOMオブジェクトに関連付けますjQuery.data()
を作成するときはClosedTune
、それへの参照を保存しますthis.$el.data('view_object', this)
。
イベントリスナーで、を取得します。ClosedTune
例:$(event.target).data('view_object')
。
ClosedTune
必要に応じて、 (in TuneBook
)と、に同じ正確なハンドラーを使用できます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を検討しましたが、チューンブックにすでにチューンモデルのコレクションがあり、同期を維持する必要がある別のオブジェクトが必要なかったため、これに反対しました。
どのようなハウスキーピング/同期を行う必要があるか、そしてその理由によって異なります。
(たとえば、TuneModel.remove()で、チューンブックのビューのリストからビューを削除する必要があります...これを行うにはおそらくイベントが必要になるため、イベントのみのソリューションがより魅力的に見え始めます)。
「チューンブックのビューのリストからビューを削除する必要がある」と感じるのはなぜですか。(私はあなたがそうすべきではないことを示唆しているのではなく、なぜあなたがしたいのかを尋ねるだけです。)そうしているので、@ ggozadのアプローチはその点でどのように違うと思いますか?
ClosedTune
どちらの手法も、オブジェクトをTuneBook
インスタンスに格納します。@ggozadの手法では、抽象化の背後に隠されているだけなので、おそらくわかりにくくなります。
私の例では、それらはプレーンなJSオブジェクト(tune_book.tunes
)に格納されています。@ggozadでは、それらは。_callbacks
によって使用される構造に格納されBackbone.Events
ます。
を追加するClosedTune
:
1.1。
this.options.tunes[tune.id] = tune;
2.2。
this.on('buttonClick:' + tune.id, tune.handler, tune);
を削除したい場合ClosedTune
(たとえば、ドキュメントから削除しtune.remove()
、ビューオブジェクトを完全に削除したい場合)、@ ggozadのアプローチを使用すると、同じ種類のハウスキーピングを実行しない限り、 ClosedTune
inへの孤立した参照が残ります。tune_book._callbacks
私が提案したアプローチを理解する:
1.1。
delete this.options.tunes[tune.id];
tune.remove();
2.2。
this.off("buttonClick:" + tune.id);
tune.remove();
各例の最初の行はオプションですClosedTune
。オブジェクトをクリーンアップするかどうかによって異なります。
オプション2は多かれ少なかれ私が今していることですが、(他の理由で)モデルをデータ属性としてview。$ elにも保存しているので、もっと良い方法が必要だと感じずにはいられません。参照をいたるところに保存するよりも。
まあ、それは最終的に物事をどのように構成するかについてのあなたの好みに帰着します。ビューオブジェクトをより集中的に保存したい場合は、TuneBook
を使用する代わりにインスタンスに保存できますjQuery.data
。#1:集中化を参照してください。
ClosedTune
何らかの方法で、オブジェクトへの参照を格納します。を使用してjQuery.data
、またはのプレーンオブジェクトで、またはのTuneBook
を使用_callbacks
しTuneBook
ます。
あなたが理解している理由で@ggozadのアプローチが好きなら、それを選んでください、しかしそれは魔法ではありません。ここに示されているように、#1で示したより単純なバージョンと比較して、追加レベルの抽象化によってどのような利点が提供されるのかわかりません。何か利点があれば、遠慮なく私に記入してください。