附加模型未定义

时间:2012-08-13 17:52:53

标签: backbone.js

我遇到的问题包括基于集合的视图中的其他模型。我有一个由父视图创建的注释列表。它需要我在呈现注释时显示当前用户名以显示删除按钮并突出显示其自己的注释。现在问题是我无法在CommentListView中访问模型会话,因此初始化中的this.session或来自addAllCommentTo列表之类的方法的调用未定。我在这做错了什么?我认为很容易将另一个对象添加到模型的视图appart中。

CommentListView:

window.CommentListView = Backbone.View.extend({

    el: $("#comments"),

    initialize: function () {

        this.model.bind('reset', this.addAllCommentToList, this);
        this.model.bind('add', this.refresh, this);
        this.model.bind('remove', this.refresh, this);
    },

    refresh: function(){
        this.model.fetch();
    },

    addCommentToList : function(comment) {
        console.log("comment added to dom");
        //need to check why el reference is not working
        $("#comments").append(new CommentView({model:comment, sessionModel: this.session}).render().el);
    },

    addAllCommentToList: function() {
        $("#comments").empty();
        this.model.each(this.addCommentToList);
    }
});

在初始化方法中从父列表调用:

window.UserDetailView = Backbone.View.extend({

    events: {
        "click #newComment" : "newComment"
    },

    initialize: function () {
        this.commentText = $("#commentText", this.el);

        new CommentListView({ model: this.model.comments, session: this.model.session });


        new LikeView({ model: this.model.like });

        this.model.comments.fetch();

    },

    newComment : function() {

        console.log("new comment");
        this.model.comments.create(
            new Comment({text: this.commentText.val()}), {wait: true}
        );
        this.commentText.val('');
    }

});

型号:

window.UserDetail = Backbone.Model.extend({

    urlRoot:'/api/details',

    initialize:function () {
        this.comments = new Comments();
        this.comments.url = "/api/details/" + this.id + "/comments";

        this.like = new Like();
        this.like.url = "/api/details/" + this.id + "/likes";

        this.session = new Session();

    },

    ...
});

1 个答案:

答案 0 :(得分:2)

我看到一个问题,但可以有其他问题。

您正在初始化视图:

new CommentListView({ model: this.model.comments, session: this.model.session });

您希望自己的视图中有一个像this.session这样的引用。

这不可能发生。您发送给View构造函数的所有哈希都将存储在this.options中,来自Backbone View constructor docs

  

创建新视图时,您传递的选项将作为this.options附加到视图中,以供将来参考。

所以你可以开始更改这一行:

$("#comments").append(new CommentView({model:comment, sessionModel: this.session}).render().el);

由另一个人:

$("#comments").append(new CommentView({model:comment, sessionModel: this.options.session}).render().el);

试着告诉我们。

更新

同时更改此行:

this.model.each(this.addCommentToList);

由此:

this.model.each(this.addCommentToList, this);

第二个参数是 context ,换句话说:你想在被叫处理程序中成为this