我想在第一次提取模型时渲染模型的视图,但不是每次更改时都是如此。
我的设置如下:
var m = new $.model.Customer({id: customer});
var v = new $.view.GeneralEditView({el: $("#general"), model: m});
m.fetch();
然后在视图初始化中,我将change事件绑定到render方法,以便在加载模型时进行渲染:
this.model.bind('change', this.render);
问题是视图会在每次更改时呈现。我想只在获取后渲染。不幸的是,我不知道在获取除变更之外的模型之后发生的任何事件。
对于我可以绑定的集合,是否存在类似'reset'的内容?
编辑:
也许更简洁地说,对于Backbone模型,有没有办法区分何时从服务器加载模型而不是在本地更改?
答案 0 :(得分:1)
<强>模型强>
您可以使特定于某个键的change
事件发生变化,例如uniqueId(如果您有):
this.model.bind('change:id', this.render, this);
默认情况下,fetch
不会直接触发任何事件,但会在使用change
set
事件
如果这不是一个选项,您始终可以在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
}
答案 1 :(得分:1)
有很多不同的方法可以解决这个问题(这些方法都假定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);
使用_.once
限制处理程序调用:
this.model.bind('change', _.once(function() {
view.render();
}));
为模型使用.ready()
模式 - example here。我喜欢这个选项,如果多个视图需要知道何时加载模型,以及何时需要能够编写相同的代码而不必担心模型是否已加载。这样做的缺点是它需要你添加一个像.isFullyLoaded()
这样的模型方法来测试每次;好处是使用测试功能,而不是设置标志,允许模型作为集合的一部分批量加载,而无需更改代码。
答案 2 :(得分:0)
我可能有https://github.com/documentcloud/backbone/pull/1468#issuecomment-6766096的一般解决方案。我在Backbone上覆盖了同步方法,如下所示:
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的建议触发自定义事件,然后调用原始成功方法。