【发布时间】:2015-08-20 12:51:02
【问题描述】:
我有一个自定义模型类,其中有一个属性可以告诉我上次获取模型的时间:
var MyModel = Backbone.Model.extend({
fetched: null,
fetch: function(options) {
var self = this;
return Backbone.Model.prototype.fetch
.apply(this, arguments)
.done(function(){
self.fetched = _.now();
});
}
});
然后,我的 View 会监听这个模型的 change 事件并在发生这种情况时呈现自己,根据模型是否已被获取,结果会有所不同:
var MyView = Backbone.View.extend({
initialize: function() {
this.listenTo(this.model, 'change', this.render);
},
render: function() {
if (this.model.fetched == null) {
// Do something
}
else {
// Do something else
}
return this;
}
});
我的问题是change 事件在Model.fetch 完成后立即触发,甚至在我设置self.fetched = _.now() 之前。
我知道此时我可以手动触发该事件,但这将是多余的,而且我不确定模型在此提取过程中是否实际发生了变化。
有没有办法捕获在调用Backbone.Model.prototype.fetch 期间触发的事件,以便我可以在链接的done 中手动触发它们?
更新:或者,有没有办法让fetch 在触发事件之前成功运行?
【问题讨论】:
-
这不是它的本意,但覆盖 parse 会让您在将数据应用到模型之前运行代码。
-
@ivarni 是的,从我在源代码中看到的情况来看,这是我在触发
change事件之前唯一可以 插入 指令的地方(参见第 592 行 @ 987654322@,执行model.set(serverAttrs, options))时触发事件)。但是,此时我会知道数据已经从服务器成功接收到了,但是如果已经成功set到模型就不知道了。我开始认为实现我想要的唯一方法是重写Backbone.Model.fetch。
标签: jquery backbone.js jquery-deferred backbone-events