5

我知道我可以设置 Backbone 模型属性的值,这样它就不会使用{silent:true}触发更改事件。我还知道,如果我将模型的属性设置为它已有的值,它不会触发更改事件,这几乎总是一件好事。但是,有没有办法强制更新模型以触发更改事件,即使它设置为相同的值?

因此,如果在我的模型中我设置了:

defaults:{
    attributeToChange: "myValue"
}

然后在使用此模型的视图中,我调用:

this.model.set('attributeToChange', 'myNewValue', {silent:true});

该值将更改,但不会触发任何更改事件。但是,如果我想在设置属性值时触发更改事件,而不管它设置为什么?所以如果我只是这样做了

this.model.set('attributeToChange','myValue');

我可以添加一个参数来强制这被视为一种变化吗?我相信我可以使用

this.model.trigger('change:attributeToChange');

但我想知道是否有办法强制更改事件在没有这个的情况下触发。

额外的问题:如果我将模型的属性设置为它已有的值,这是否会使属性的先前值成为我启动更改之前的值?

this.model.set('attributeToChange','someValue');
this.model.set('attributeToChange','anotherValue');
this.model.set('attributeToChange','anotherValue');
console.log(this.model.previous('attributeToChange')); //someValue or anotherValue?
4

3 回答 3

4

当您在 Backbone 中为模型设置值时,Backbone 会将新值与当前值进行比较,并将更改的值添加到数组中(请参阅https://github.com/documentcloud/backbone/blob/master/backbone. js#L342)。

然后,如果changes数组包含元素,如果silent 未设置为true,Backbone 将为每个更改的项目触发“change:{key}”事件。(参见https://github.com/documentcloud/backbone/blob/master/backbone.js#L357)。

最后,它还会触发全局“change”事件(同样,如果silent 未设置为true)。

因此,如果您想在未更改的属性上强制触发,您可以像 Backbone 一样手动触发事件,或者像 @Loamhoof 建议的那样覆盖 set 方法。

于 2013-04-11T08:24:40.593 回答
3

可悲的是,这里什么都没有。我想您可以更改 set 方法的代码,但这会很丑陋。另一种解决方案是在开头或结尾重写它(这是您可以做的“简单”更改来重写方法)。

一开始,问题是您的属性尚未设置(也未验证)。
那么,让我们拭目以待。

var set = Backbone.Model.prototype.set;
Backbone.Model.prototype.set = function() {
  // do stuff before
  set.apply(this, arguments);
  // do stuff after
  this.trigger('myCustomEvent');
  return this;
};

(我认为在定义模型之前您不必这样做,但可能是。)

于 2013-04-10T18:36:06.207 回答
1

当我设置存在模型属性另一个具有相同键和值的对象时,我遇到了这个问题。那是不同的对象,但模型没有触发“更改”事件。因此,对于这个问题,我使用了这样的解决方案:我将属性设置为“静默”模式下的模型,然后触发特定属性的“更改”事件。例如

this.model.set({currentPage: page,
                currentPanel: panel}, {silent:true});
this.model.trigger('change:currentPanel');
于 2016-02-23T11:07:01.510 回答