为什么我的主干模型hasChanged()总是返回false

Why does my Backbone model hasChanged() always return false?

本文关键字:返回 false hasChanged 我的 模型 为什么      更新时间:2023-09-26

给定以下片段:

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(..)之后返回truesilent标志不再具有任何作用。

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