为什么我的主干模型hasChanged()总是返回false
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/
EDIT:似乎除非您将{ silent: true; }
传递给set()
方法,否则它将在您的模型上触发change
事件,从而清除changedAttributes()
等。本质上,这些属性只跟踪自上次触发change
事件以来的更改。
我在文档中读过,但一开始并没有真正理解。
这对我来说似乎没有多大用处。我希望能解释一下为什么这样做,以及实现我想要的结果的最佳方式。(绕过{silent: true; }
并放弃使用change
事件似乎是一种浪费。)
除非您将{ silent: true; }
传递给set()
方法,否则它将在您的模型上触发change
事件,从而清除changedAttributes()
等。本质上,这些属性只跟踪自上次触发change
事件以来的更改。
因此,答案是将其称为:
m.set('name', 'something else', {silent: true})
本文以旧版本Backbone以前的行为为前提。hasChanged
现在(从0.9.10开始)总是在调用set(..)
之后返回true
。silent
标志不再具有任何作用。
这在问题中链接的jsfiddle中被混淆了,该问题使用backbone.js的CDN托管副本,该副本始终使用最新版本。以下是一些更新的jsfiddles,显示了行为的变化:
- jsfiddle使用Backbone 0.9.2
- jsfiddle使用Backbone 0.9.10
Model.set()
将属性哈希作为第一个参数。尝试m.set({'name': 'something else'});
。执行m.set('name', 'something')
不会设置"name",因此它从不触发change
事件,并且对hasChanged()
的调用返回false
。您总是可以通过注销m.attributes
来检查属性哈希的当前值,尽管不建议直接访问和操作它,因为没有任何更改事件会以这种方式触发。
- Array.every返回false,而不是类型error
- Javascript If else 只返回 TRUE 或只返回 FALSE
- 为什么当我在数组上测试regex时,它会返回false
- 检查文本区域是否为空总是返回false
- PHP strtotime()为JavaScript日期字符串返回false
- onsubmit返回false,但submit仍然执行
- 这个代码会返回false吗
- Ajax向表单返回false
- 表单验证JavaScript编号总是返回false
- 使用!而in运算符在应该为true时返回false,为什么
- jQuery.is(':checked')总是返回false
- Javascript 下划线每个总是返回 false
- 提交返回 false 总是在 jquery 中
- 为什么 1.2 == true 返回 false 如果布尔值 (1.2) 实际上是真的
- 如果循环中至少有一个元素返回 false,如何将变量设置为 false
- 基本JavaScript不断返回false
- 布尔对象上的逻辑 NOT 在 Javascript 中总是返回 false
- jquery focusin没有'调用.focus()并返回false;时无效;
- Ajax-执行成功前返回false
- jQuery JSON flickr提要返回false不工作