1

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

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

是说模型未定义,但我确定模型已定义。

4

1 回答 1

0

您的子视图需要在父视图中创建initialize,或者在创建父视图的实例之前创建。

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

initialize: function(){
    FriendsView.__super__.initialize.apply();
}

您在 GenericView 上调用初始化,但不是 GenericView 的实例。该定义没有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 调用它,因为孩子和父母正在查看同一个模型。

于 2013-06-27T01:03:40.983 回答