[英]Why does my Backbone model hasChanged() always return 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; }
{ silent: true; }
的set()
方法,那么将触发change
你的模型事件,送走changedAttributes()
等。从本质上讲这些属性只跟踪自从上次的变化change
事件被触发。
我在文档中读到了它,但起初并没有真正理解它。
这对我来说似乎没什么用。 我将不胜感激任何解释为什么它的工作方式和实现我想要的结果的最佳方式。 (绕过{silent: true; }
并放弃使用change
事件似乎是浪费。)
除非你通过{ silent: true; }
{ silent: true; }
的set()
方法,那么将触发change
你的模型事件,送走changedAttributes()
等。从本质上讲这些属性只跟踪自从上次的变化change
事件被触发。
所以答案是改为:
m.set('name', 'something else', {silent: true})
这篇文章的前提是旧版Backbone的旧行为。 hasChanged
现在这样 ( 为0.9.10 )总是返回true
后set(..)
被调用。 silent
旗帜不再有任何影响。
这在使用CDN托管的backbone.js副本的问题链接的jsfiddle中被混淆地掩盖了,该副本总是使用最新版本。 这是一些更新的jsfiddles,显示行为的变化:
Model.set()
将属性hash作为第一个参数。 尝试m.set({'name': 'something else'});
。 执行m.set('name', 'something')
不设置'name',因此它永远不会触发change
事件,并且你对hasChanged()
调用返回false
。 您始终可以通过注销m.attributes
来检查属性哈希的当前值 - 虽然不建议直接访问和操作它,因为任何更改事件都不会以此方式触发。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.