为什么我的Backbone模型hasChanged()总是返回false?

jos*_*hls 14 javascript backbone.js

给出以下代码段:

var m = new Backbone.Model({
    name: 'joshua'
});

m.set('name', 'something else');
Run Code Online (Sandbox Code Playgroud)

如果我现在打电话m.hasChanged()m.hasChanged('name')我得到false.为什么?我的理解是这两者都应该回归true.

m.changedAttributes() 也返回false.

这是一个小提琴,说明我正在做什么,并期待:http://jsfiddle.net/9cvVv/88/

编辑: 似乎除非你传递{ silent: true; }set()方法然后它将change在模型上触发事件清除changedAttributes(),等等.基本上这些属性仅跟踪自上次change触发事件以来的更改.

我在文档中读到了它,但起初并没有真正理解它.

这对我来说似乎没什么用.我将不胜感激任何解释为什么它的工作方式和实现我想要的结果的最佳方式.(绕过{silent: true; }并放弃使用该change事件似乎是浪费.)

jos*_*hls 15

除非您传递{ silent: true; }给该set()方法,否则它将change在您的模型上触发事件以清除changedAttributes()等等.实际上,这些属性仅跟踪自上次change触发事件以来的更改.

所以答案是改为:

m.set('name', 'something else', {silent: true})
Run Code Online (Sandbox Code Playgroud)


pim*_*ttc 11

这篇文章的前提是旧版Backbone的旧行为. hasChanged 现在(从0.9.10开始)总是trueset(..)调用之后返回.该silent标志不再有任何影响.

这在使用CDN托管的backbone.js副本的问题链接的jsfiddle中被混淆地掩盖了,该副本总是使用最新版本.这是一些更新的jsfiddles,显示行为的变化: