给出以下代码段:
var m = new Backbone.Model({
name: 'joshua'
});
m.set('name', 'something else');
如果我现在致电m.hasChanged()
或m.hasChanged('name')
,我会false
。 为什么?我的理解是这两者都应该返回true
。
m.changedAttributes()
也会返回false。
这是一个小提琴,说明我正在做什么,并期待:http://jsfiddle.net/9cvVv/88/
编辑:似乎除非您将{ silent: true; }
传递给set()
方法,否则它会触发模型上的change
事件,清除{ {1}}等。基本上这些属性仅跟踪自上次触发changedAttributes()
事件以来的更改。
我在文档中读到了它,但最初并没有真正理解它。
这对我来说似乎没什么用。我将不胜感激任何解释为什么它的工作方式和实现我想要的结果的最佳方式。 (绕过change
并放弃使用{silent: true; }
事件似乎是浪费。)
答案 0 :(得分:15)
除非您将{ silent: true; }
传递给set()
方法,否则它会在您的模型上触发change
事件,清除changedAttributes()
等等。基本上这些属性仅跟踪自上次触发change
事件以来的更改。
所以答案是改为:
m.set('name', 'something else', {silent: true})
答案 1 :(得分:11)
这篇文章的前提是旧版Backbone的先前行为。 hasChanged
现在(as of 0.9.10)在调用true
后始终返回set(..)
。 silent
标志不再有效。
这在使用CDN托管的backbone.js副本的问题中链接的jsfiddle中容易被掩盖,该副本总是使用最新版本。这里有一些更新的jsfiddles显示了行为的变化:
答案 2 :(得分:-7)
Model.set()
将属性哈希作为第一个参数。试试m.set({'name': 'something else'});
。执行m.set('name', 'something')
时未设置“名称”,因此它永远不会触发change
事件,而您对hasChanged()
的调用将返回false
。您可以通过注销m.attributes
来检查属性哈希的当前值 - 虽然不建议直接访问和操作它,因为没有任何更改事件会以这种方式触发。