Backbone.js 在第一次加载时为模型渲染视图,而不是每次更改时
我希望在第一次获取模型时为模型渲染视图,但不是在每次更改时 我的设置如下:Backbone.js 在第一次加载时为模型渲染视图,而不是每次更改时,backbone.js,backbone-events,backbone-views,Backbone.js,Backbone Events,Backbone Views,我希望在第一次获取模型时为模型渲染视图,但不是在每次更改时 我的设置如下: var m = new $.model.Customer({id: customer}); var v = new $.view.GeneralEditView({el: $("#general"), model: m}); m.fetch(); Backbone.Model.prototype.sync = function(method, model, options) { var succ = opti
var m = new $.model.Customer({id: customer});
var v = new $.view.GeneralEditView({el: $("#general"), model: m});
m.fetch();
Backbone.Model.prototype.sync = function(method, model, options) {
var succ = options.success;
var customSuccess = function(resp, status, xhr) {
//call original
succ(resp, status, xhr);
model.trigger('synced', model, options);
}
options.success = customSuccess;
Backbone.sync(method, model, options);
}
然后在视图初始化中,我将更改事件绑定到渲染方法,以便在加载模型时进行渲染:
this.model.bind('change', this.render);
问题是每次更改后都会呈现视图。我只想在取回后渲染。不幸的是,除了更改之外,我没有发现在获取模型之后触发的任何事件
是否有类似于“重置”的集合可以绑定到
编辑:
也许更简洁地说,对于主干模型,有没有办法区分何时从服务器加载模型和何时在本地更改模型?模型 您可以使
change
事件特定于某个键的更改,例如uniqueId(如果有):
默认情况下,fetch
不会直接触发任何事件,而是在使用set
加载新数据后间接触发change
事件
如果这不是一个选项,则始终可以在fetch
函数中触发事件:
initialize: function () {
this.model.bind("fetch", this.update, this);
}
fetch: function () {
// do stuff
this.model.trigger("fetch", this);
}
update: function () {
// your refresh stuff here
}
我可能有一个通用的解决方案。我在主干上重写了sync方法,如下所示:
var m = new $.model.Customer({id: customer});
var v = new $.view.GeneralEditView({el: $("#general"), model: m});
m.fetch();
Backbone.Model.prototype.sync = function(method, model, options) {
var succ = options.success;
var customSuccess = function(resp, status, xhr) {
//call original
succ(resp, status, xhr);
model.trigger('synced', model, options);
}
options.success = customSuccess;
Backbone.sync(method, model, options);
}
为了保存原始的成功方法,除非我需要,否则我不想弄乱它,请通过自定义成功方法。调用自定义成功方法时,会按照@Austin的建议触发自定义事件,然后调用中的原始成功方法。有许多不同的方法来实现这一点(这些方法都假定
var view=this;
在您的视图代码中的某个地方):
- 使用一次性成功回调调用
:.fetch()
m.fetch({ success: function() { view.render(); } });
- 绑定到
但在处理程序中取消绑定:change
function handle() { view.render(); view.model.off('change', handle); } this.model.bind('change', handle);
- 使用
\一次
来限制处理程序调用:
this.model.bind('change', _.once(function() { view.render(); }));
- 为您的型号使用
模式-。我喜欢在多个视图需要知道模型何时加载的情况下使用此选项,并且您需要能够编写相同的代码,而不必担心模型是否已加载。这样做的缺点是,它需要您添加一个模型方法,如.ready()
,以便每次都进行测试;好处是,使用测试函数而不是设置标志,可以将模型作为集合的一部分批量加载,而无需更改代码.isFullyLoaded()
this.model.trigger
放在AJAX调用的回调中。我希望听到是否有人能够预见这种方法的问题。我只是有点不确定这一切会对“这个”的范围产生怎样的影响……我认为这是唯一可靠的方法。使用新同步事件的方法不能保证在同步完成后正确填充模型,因此会导致问题。选择了“关闭”方法。谢谢