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

时间:2012-03-27 15:31:23

标签: javascript backbone.js

给出以下代码段:

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; }事件似乎是浪费。)

3 个答案:

答案 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来检查属性哈希的当前值 - 虽然不建议直接访问和操作它,因为没有任何更改事件会以这种方式触发。