Backbone.js继承的视图

Backbone.js继承的视图,backbone.js,Backbone.js,我有一个主干视图层次结构,如下所示: GenericView = Backbone.View.extend({ templatesPath: "source/public/templates/", initialize: function(){ var that = this; this.model.fetch({ success: function(model,response){ that.handleResponse(response

我有一个主干视图层次结构,如下所示:

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");
        }
    });
}
}))

扩展通用视图的视图是:

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({...});

表示模型未定义,但我确信模型已定义。

您的子视图需要在父视图的
初始化中创建,或者在创建父视图实例之前创建

模型未定义的问题是由于您在FriendsView中执行了以下操作:

initialize: function(){
    FriendsView.__super__.initialize.apply();
}
您正在对GenericView调用initialize,但不是GenericView的实例。定义中没有此.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();
     }
});
但是 将您的模型放在儿童视图中不是更容易吗?或者使用事件侦听更改,而不是跨不同实体启动更改

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调用它,因为子对象和父对象正在查看同一个模型。

您应该编辑此问题。措辞令人困惑。您是在谈论视图继承还是嵌套视图(例如,创建项目视图的列表视图)?我认为是后者,但你的代码看起来是关于继承的。是的。同意Gohn67。我发布了一个答案,但仍然不确定它是否合适,因为您讨论了嵌套视图,但您的示例似乎并不是这样做的。您的回答是正确的。我对主干相当陌生,所以混淆了嵌套视图和继承。这确实实现了我想要的,但不确定在childView中使用我的模型意味着什么。我认为问题并不是那么清楚。我想要的是在页面加载时获取我想要的所有数据。我能想到的最简单的方法就是在初始化视图时执行。但是我也想要代码的可重用性,所以我考虑创建这个继承结构。现在底线是我得到了我需要的:D谢谢。我在childview中拥有模型的意思是,当你实例化你的孩子时,只需将模型传递给孩子。请参见编辑。