我将骨干.js与require.js一起使用,并且具有一个父视图和两个子视图。
我想在ParentModel中有通用的默认值,要在ParentView中控制默认值并从子视图中调用ParentView逻辑,请使用通用逻辑。
代码在这里。
parentView.js
define(
['jquery', 'underscore', 'backbone', 'models/parentModel'],
function($, _, Backbone, ParentModel) {
var ParentView = Backbone.View.extend({
model: new ParentModel(),
initialize: function() {
this.model.on("change:hoge", this.switchHoge);
},
parentSet: function(k, v) {
// context is childen model
// want to set parent model
this.model.set(k, v);
},
switchHoge: function(k, v) {
if (this.model.get("view") == "A") {
console.log("aaaaaaaaaaaa");
} else if (this.model.get("view") == "B") {
console.log("bbbbbbbbbbbb");
}
}
});
return ParentView;
}
);
childView_A
var ChildView_A = ParentView.extend({
model: new ChildModel_A(),
change: function() {
this.parentSet("hoge", "A");
}
}
childView_B.js
var ChildView_B = ParentView.extend({
model: new ChildModel_B(),
change: function() {
this.parentSet("hoge", "B");
}
});
parentSet上下文被子模型替换的问题。
因此,不调用绑定在ParentView中的函数。
如果我将ParentView:model重命名为ParentView:another_model,则可以解决此问题。
但这似乎并不美丽。
这是Backbone.js中的错误做法吗?
我做什么?
最佳答案
好吧,我认为当您创建新的子视图时,您可以引用父视图:
var Parent = new ParentView({model: model});
var Child_A = new ChildView_A({parent: Parent});
然后在您的chieldview中,您可以执行以下操作:
this.options.parent.parentSet("hoge", "A");
然后应该在父视图的上下文中调用该方法。
您还可以在子视图的初始化方法中添加以下行,以更轻松地访问父视图:
this.parentView = this.options.parent;
这是一个工作的小提琴:
http://jsfiddle.net/5JRZe/2/