2012-03-27 88 views
14

考虑下面的代码片段:为什么我的Backbone模型hasChanged()总是返回false?

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事件,清除了changedAttributes()等。实质上,这些属性仅跟踪自上次触发事件以来的更改。

我在文档中阅读过,但一开始并没有真正理解它。

这对我来说似乎不是很有用。我将不胜感激任何解释,为什么这种方式的工作方式,以及达到我想要的结果的最佳方式。 (绕过{silent: true; },并放弃change事件的用法似乎是一种浪费。)

回答

15

除非你传递{ silent: true; }set()方法,然后将这些本质上的火,你的模型,它会清除出changedAttributes()change事件属性仅跟踪自上次触发change事件以来的更改。

所以答案是改为调用此:

m.set('name', 'something else', {silent: true}) 
+0

嗯哼。我为发送一批模型并返回的集合做了一个'save()'方法。想知道为什么hasChanged()似乎没有做任何事情。 :-) 谢谢! – jmk2142 2012-03-28 23:16:03

+0

这在Backbone的新版本中不再是真的;看到我的答案。 – pimlottc 2014-04-02 18:51:51

+0

用骨干0.9.2保存我的一天... – gor181 2016-01-27 16:16:51

-7

Model.set()需要一个属性哈希作为第一个参数。尝试m.set({'name': 'something else'});。做m.set('name', 'something')没有设置'名称',所以它不会触发change事件,您致电hasChanged()返回false。您可以通过注销m.attributes来始终检查属性散列的当前值 - 虽然不建议直接访问和操作它,因为没有任何更改事件会以这种方式触发。

+1

错了。 'Model.set()'支持像我使用的散列和单个属性。该属性正在设置,你可以在[稍微扩展的小提琴]中看到(http://jsfiddle.net/H2raK/1/)。这也是[在Backbone.js文档中](http://backbonejs.org/#Model-set)。 – joshuapoehls 2012-03-27 16:41:07

+0

对不起,应该仔细阅读。你想要做什么?你可以绑定到模型'change'事件。通过这种方式,你可以检查具体属性的变化w/hasChanged(attr)'(看你是否需要更新视图的某个部分)。我编辑了你的[小提琴](http://jsfiddle.net/H2raK/4/)来说明这一点。 – meirish 2012-03-27 17:49:43

+0

本质上,我试图获取自模型保存后更改的属性列表。现在我通过'{silent:true}',然后检查'changedAttributes()'。这完全符合我的需要,我只是希望Backbone更像数据模型中传统的'isDirty'标志。 – joshuapoehls 2012-03-27 18:26:54

11

这篇文章的前提是以前旧版Backbone的行为。 hasChanged现在确实as of 0.9.10)总是返回trueset(..)被调用后。 silent标志不再有任何作用。

这在使用Backbone.js的的CDN托管的副本总是使用最新版本的问题联系在一起的jsfiddle是容易混淆掩盖。下面是显示行为的变化有些更新jsfiddles:

相关问题