如何从骨干中的model.save()成功回调中触发视图事件?

时间:2013-05-10 18:10:40

标签: javascript backbone.js

我需要通知我的网页用户从服务器返回的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?");
                }
            }});
}

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

谢谢!

3 个答案:

答案 0 :(得分:3)

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

选项1

// The view that you would like to show

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

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

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

选项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
     }
}

答案 1 :(得分:2)

model.save返回一个promise。您可以在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 :(
    });
},

答案 2 :(得分:1)

你有没有理由不做:

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

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

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