这可能是因为误用组件,但我不这么认为。 我有一个问题,View在Backbone JS中更新模型并调用模型的Set方法,以便它可以验证它的输入。 从理论上讲,这种行为有两个结果:错误和变化。 两项活动均按规定运作。 但实际上还有第三个事件:没有变化。 也就是说,如果输入完全没有改变,我在调用Set之后无法判断,因为不会抛出任何错误,也不会发生更改事件,因为没有实际改变 - 但我仍然想知道这样的情况。 我有办法做到这一点吗?
原因是只有在没有错误发生的情况下才会执行我想要执行的操作,但是我无法知道(没有更改事件)模型已尝试设置新值并且没有结果因为这一切都是异步发生的。
谢谢!
答案 0 :(得分:8)
每个Backbone模型都有一个hasChanged
method:
hasChanged
model.hasChanged([attribute])
自上次
"change"
事件以来模型是否已更改?如果传递属性,则返回true
,如果该特定属性已更改。
也许你可以用它来检查你的第三种可能性。
BTW,回调不是异步的。触发错误和更改的回调并在set
returns之前返回:
set : function(attrs, options) {
//...
// Run validation.
if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false;
//...
// Update attributes.
for (var attr in attrs) {
var val = attrs[attr];
if (!_.isEqual(now[attr], val)) {
now[attr] = val;
delete escaped[attr];
this._changed = true;
if (!options.silent) this.trigger('change:' + attr, this, val, options);
}
}
_performValidation
调用会触发错误回调,this.trigger
调用将调用每个属性的回调。
答案 1 :(得分:0)
在这种情况下,您可能需要在Model.set()
附近跳一点才能到达您想要的位置。如果您使用此功能,那么您应该在模型上定义validate()
方法。
http://documentcloud.github.com/backbone/#Model-validate
所以你可以直接调用这个方法......
// something happens and we need to update the model to "newvalues"
if (model.validate(newvalues)) {
model.trigger('error')
} else {
model.trigger('change')
}
model.set(newvalues)
这样,即使它是相同的,你也总是至少得到'改变'或'错误'。您还将从set中获取现有事件。