我有一个骨干视图层次如下:
GenericView = Backbone.View.extend({
templatesPath: "source/public/templates/",
initialize: function(){
var that = this;
this.model.fetch({
success: function(model,response){
that.handleResponse(response);
},
error: function(){
console.log("err");
}
});
}
});
和扩展Generic视图的视图是:
FriendsView = GenericView.extend({
url: "friends.php",
el: $("fiends-list"),
model: new Person(),
initialize: function(){
FriendsView.__super__.initialize.apply();
},
handleResponse: function(res){
}
});
我想要做的是从父初始化函数访问子视图函数。我发现了一些类似的问题,但所有在谈论它的地方 - 从父母到孩子的访问,我在“ FriendsView。 super .initialize.apply();“ -
行:
this.model.fetch({...});
表示模型未定义,但我确信模型已定义。
答案 0 :(得分:0)
您的子视图需要在父视图的initialize
内创建,或者在创建父视图的实例之前创建。
您的模型未定义的问题是由于您在FriendsView中执行以下操作:
initialize: function(){
FriendsView.__super__.initialize.apply();
}
您正在调用GenericView上的初始化,但不是GenericView的INSTANCE。该定义没有this.model
。
请注意,下面的示例可能完全没用,但我将删除您对父视图和子视图的描述。如果这是错的,请通知我。
我会做类似的事情:
ParentView = Backbone.View.extend({
initialize: function () {
this.childView = new FriendView({ parentView: self });
//do other init things here.
},
fetchModel: function () {
var that = this;
this.model.fetch({
success: function(model,response){
that.childView.handleResponse(response);
},
error: function(){
console.log("err");
}
}
});
FriendsView = GenericView.extend({
initialize: function (opts) {
this.parentView = opts.parentView;
this.parentView.fetchModel();
}
});
<强>然而强> 将您的模型放在childView中会不会更容易?或者使用事件来监听变化,而不是在不同实体之间启动变更?
ParentView = Backbone.View.extend({
initialize: function () {
this.childView = new FriendView({ model: this.model });
//do your other things here
},
//other functions
现在,当您想要在childView中处理响应时,您可以为此设置一个事件:
FriendsView = GenericView.extend({
initialize: function (opts) {
this.listenTo(this.model,'sync',this.handleResponse)
this.model.fetch({
error:function () {
console.log("err");
}
});
}
});
这样,无论调用fetch的位置,都可以获得该事件。即使您从parentView调用它,因为子和父看着相同的模型。