Backbone.js继承了视图

时间:2013-06-26 15:04:20

标签: 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);
        },
        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({...});

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

1 个答案:

答案 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调用它,因为子和父看着相同的模型。