Javascript 如何判断Backbone.js中的模型是否未更改?
这可能是由于对组件的误用,尽管我不这么认为。 我遇到一个问题,视图在主干JS中更新模型,并调用模型的Set方法,以便验证其输入。 理论上,这种行为有两种结果:错误和变化。 这两项活动都按规定进行。 但事实上还有第三件事:没有变化。 也就是说,如果输入根本没有被更改,我无法在调用Set后判断,因为不会抛出错误,也不会抛出更改事件,因为实际上没有任何更改-但我仍然想知道这种情况。 我有办法做到这一点吗 原因是,只有在没有错误发生的情况下,我才希望执行一个操作,但我无法知道(如果没有更改事件),模型已尝试设置新值,但由于所有操作都是异步进行的,因此没有结果Javascript 如何判断Backbone.js中的模型是否未更改?,javascript,backbone.js,underscore.js,Javascript,Backbone.js,Underscore.js,这可能是由于对组件的误用,尽管我不这么认为。 我遇到一个问题,视图在主干JS中更新模型,并调用模型的Set方法,以便验证其输入。 理论上,这种行为有两种结果:错误和变化。 这两项活动都按规定进行。 但事实上还有第三件事:没有变化。 也就是说,如果输入根本没有被更改,我无法在调用Set后判断,因为不会抛出错误,也不会抛出更改事件,因为实际上没有任何更改-但我仍然想知道这种情况。 我有办法做到这一点吗 原因是,只有在没有错误发生的情况下,我才希望执行一个操作,但我无法知道(如果没有更改事件),模型已
谢谢 每个主干模型都有一个: 已更改
模型。已更改([属性])
自上次“更改”事件以来,模型是否已更改?如果传递了属性,如果该特定属性已更改,则返回true
也许你可以用它来检查你的第三种可能性
顺便说一句,回调不是异步的。错误和更改的回调将在以下时间之前触发并返回:
\u performValidation
调用会触发错误回调,而this.trigger
调用会调用每个属性回调。在这种情况下,您可能需要在Model.set()
周围跳一点才能到达您想要的位置。如果您正在使用此功能,那么您应该在模型上定义一个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获取现有事件。谢谢!我觉得它是异步的。我将尝试使用hasChanged…@Che:任何命中服务器(
sync
,save
,…)的操作都将是异步的,任何仅在浏览器中发生的操作都将是同步和顺序的。请查看上面发布的代码。hasChanged()查找此项。如果未将模型设置为新值,则不会触及已更改的。所以这不起作用。@maxl0rd:这是OP感兴趣的第三种状态,所以你没有任何意义。@muistooshort抱歉,我不清楚。我想说明的是_changed,或hasChanged()仅在更改事件的事件处理程序中的短暂提示中有用。因为这些不会在所有情况下都被触发,所以没有建设性的时间在他的用例中检查该属性。
// 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)