4

同様の質問がすでにここで尋ねられましたモデル.保存()で成功コールバックをトリガーするにはどうすればよいですか? 、しかし、コールバックからイベントをトリガーする方法はまだ答えがありません。

したがって、ここsuccessにコードのコールバックがあります。ここで、addOneイベントを呼び出して、保存されたコメントをレンダリングします。すべてがうまく機能しますが、コールバックでこのイベントをトリガーthis.addOne(receivedItem);することはできません。thisどこでも - 私はできます。

この問題を解決するには?

CommentsListView = Backbone.View.extend({
    ...
    addOne: function (item) {
        var commentView = new CommentView({
            model: item
        });
        this.$el.append(commentView.render().el);
    },
    addNewComment: function (event) {
        var item = {
            post_id: this.$('#post_id').val(),
            text: this.$('#text').val()
        };
        var commentItem = new CommentItem();
        commentItem.save({'model':item}, { 
            success: function(receivedItem, response) {
                this.addOne(receivedItem); // Uncaught TypeError: Object [object Window] has no method 'addOne'.
            }
        }, this);
    }
});
4

2 に答える 2

9

これは、成功のコールバックのスコープが異なりthis、ビューを指していないために発生します。
これをすばやく解決するには、参照を作成しthisて代わりに使用します。

var self = this;
commentItem.save({'model':item}, { 
    success: function(receivedItem, response) {
        self.addOne(receivedItem); // works
    }
});

または、アンダースコアのbindメソッドを使用して、別のコンテキストを関数にバインドできます。

success : _.bind(function(receivedItem, response) {
    this.addOne(receivedItem); 
}, this)
于 2012-12-29T11:43:11.047 に答える