コードを検討してください(JSFiddle にもあります):
// Backbone calls this "view3"
InnerView = Backbone.View.extend({
initialize: function() {
this.parent = this.options.parent;
this.listenTo(
this.model,
"change:name",
function() { this.parent.onNameChange() }
);
}
});
// Backbone calls this "view2"
OuterView = Backbone.View.extend({
initialize: function() {
this.innerView = new InnerView({
model: this.model,
parent: this
});
},
onNameChange: function() {
console.log("'this' is bound to the outerview instance: " + (this.cid === "view2"));
}
});
var myModel = new Backbone.Model({ name: "foo" });
var outerView = new OuterView({ model: myModel });
// trigger onNameChange
myModel.set("name", "bar");
これ'this' is bound to the outerview instance: true
はコンソールに出力されます。ただし、コールバックを次のように変更すると:
this.listenTo(
this.model,
"change:name",
this.parent.onNameChange
);
(これはこのフィドルで実行しました)、コンソールに が表示されます'this' is bound to the outerview instance: false
。代わりthis
にインスタンスにバインドされているようです。InnerView
どうしてこれなの?listenTo ドキュメントを読んだ後、は内部で呼び出されるthis
ため、常にInnerView
インスタンスにバインドされると予想されます。listenTo
InnerView