3

我需要通知我网页的用户什么 model.save() 调用从服务器返回。

情况是这样的,点击触发视图中的 getAnswer(),然后触发模型方法 getAnswerServer(),该方法调用模型上的 .save(),传递一个访问响应的成功回调。

但是我如何通知用户(通过使用视图事件或其他任何东西)响应是什么?

以下是我的观点:

events: {"click button#active" : 'getAnswer'},

initialize: ...
render: ...

getAnswer: function() {

        this.model.getAnswerFromServer();
    },

该模型:

getAnswerFromServer: function() {

   this.save({myAnswer1 : false}, {success: function(model, response) {

                answer = model.get('answer');

                if (answer === true) {
                    console.log("The answer is true! But how do I tell the user about it?");
                }
                else if (answer === false) {
                    console.log("The answer is false! But again, how do I tell this to my user?");
                }
            }});
}

理想情况下,我希望能够在这里调用事件处理程序并在不同的视图中触发事件,但我不知道如何从成功回调中访问它?实际上,即使为此视图触发自定义事件也足够了。

谢谢!

4

3 回答 3

3

您始终可以sync event在要显示的视图上使用

选项1

// The view that you would like to show

    initialize: function() {
          this.listenTo(this.model, 'sync', this.render);
    }

当正在保存的模型与服务器同步时,这将被调用。

但是,如果您想要显示的视图不包含此模型,那么您始终可以定义一个自定义事件处理程序并触发 this 是回调..

选项 2

var customEvents = _.extend({}, Backbone.Events);

this.save({
    myAnswer1: false
}, {
    success: function (model, response) {
        answer = model.get('answer');        
        customEvents.trigger('notifyAnswer', { isAnswer : answer });
    }
});

// 在要显示的视图中

initialize: function() {
     this.listenTo(customEvents, 'notifyAnswer', this.notify);
},
notify: function(data) {
     if(data.isAnswer) {
          // Show something
     }
     else { 
         // show something else
     }
}
于 2013-05-10T18:14:58.653 回答
2

model.save 返回一个承诺。您可以在 getAnswer 方法中捕获它并触发事件或处理您的错误:

getAnswer: function() {
    var self = this;
    var p = this.model.save();

    p.done(function(data, status) {
       answer = self.model.get('answer');

       if (answer === true) {
           self.doTrueThing();
       }
       else if (answer === false) {
           self.doFalseThing();
       }
    });
    p.fail(function() {
       // failed :(
    });
},
于 2013-05-10T18:20:21.640 回答
1

您是否有理由不只是在做:

getAnswer: function() {
    this.model.save({myAnswer1 : false}, {success: function() {
            ...
            }.bind(this)});
},

在视图本身中,而不是使用模型中定义的函数?

然后,您可以将成功处理程序绑定到视图(使用.bind(this),如上所述),然后将成功处理程序中的视图称为this. 然后,您可以调用视图中定义的任何函数来更新视图,例如this.updateMe().

于 2013-05-10T18:27:58.970 回答