0

コレクションに基づくビューに追加のモデルを含めるのに問題があります。親ビューによって作成されたコメントのリストがあります。コメントをレンダリングして削除ボタンを表示し、自分のコメントかどうかを強調表示するときに、現在のユーザー名を持っている必要があります。問題は、CommentListViewでモデルセッションにアクセスできないため、初期化でのthis.sessionまたはaddAllCommentToリストなどのメソッドからの呼び出しが定義されていないことです。私がここで間違っていることは何ですか?モデルからビューアパートメントに別のオブジェクトを簡単に追加できると思いました。

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

initializeメソッドの親リストからの呼び出し:

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();

    },

    ...
});
4

1 に答える 1

2

1つの問題がありますが、他の問題がある可能性があります。

次のようにビューを初期化しています。

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

そして、あなたはあなたのビューにこのような参照があることを期待していますthis.session

これは起こりません。Viewコンストラクターに送信するすべてのハッシュは、 BackboneViewコンストラクターのドキュメントthis.optionsからに保存されます。

新しいビューを作成するときに、渡したオプションは、後で参照できるように、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);

2番目の引数はコンテキストです。言い換えるとthis、呼び出されたハンドラーに何を入れたいかです。

于 2012-08-13T19:41:41.807 に答える