我需要通知我的网页用户从服务器返回的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?");
}
}});
}
理想情况下,我希望能够在此处调用事件处理程序并在不同的视图中触发事件,但我无法弄清楚如何从成功回调中访问它?甚至为这个视图触发自定义事件实际上也足够了。
谢谢!
答案 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()
。