确定模型的当前属性是否与默认值不同的最简单方法是什么?

时间:2014-10-06 14:35:48

标签: javascript backbone.js

我有一个具有以下默认值的模型:

Entities.OrdersFilter = Backbone.Model.extend({
    defaults: {
        'start-date': '2014-09-01',
        'end-date': '2014-10-01',
        'status': 'OUTSTANDING'
    },
    localStorage: new Backbone.LocalStorage('OrderFilters')
});

这三个属性表示可由用户更改的过滤器。我需要显示一个" Clear Filters"按钮,但仅当过滤器与默认值不同时。我知道Backbone提供hasChanged状态,但我相信只会告诉我自上次set后它是否发生了变化,而不是默认值。

如何检查模型的当前属性值是否与默认值不同?

2 个答案:

答案 0 :(得分:2)

Backbone已经提供了一个changedAttributes方法,用于检查当前属性是否与您在散列中提供的属性不同(在您的情况下,此散列将是模型的默认值)。

来自Backbone< strong> changedAttribute 文档:

  

仅检索自此更改的模型属性的哈希值   最后一组,如果没有,则为假。可选地,外部   属性hash可以传入,返回属性   hash与模型不同。这可以用来找出哪个   应该更新视图的某些部分,或者需要进行哪些调用   将更改同步到服务器。

所以你可以写一些类似的东西:

var MyModel = Backbone.Model.extend({
    defaults: {
        'start-date': '2014-09-01',
        'end-date': '2014-10-01',
        'status': 'OUTSTANDING'
    },
    changedFromDefaults: function(){
        return this.changedAttributes(this.defaults) !== false; 
    }
});

并像这样使用它:

var model = new MyModel();
console.log(model.changedFromDefaults()); //false

model.set('status', "FOO");
console.log(model.changedFromDefaults()); //true

model.set('status', "OUTSTANDING");
console.log(model.changedFromDefaults()); //false

我已创建a fiddle,因此您可以尝试一下。

答案 1 :(得分:0)

在Backbone.View中,您可以聆听模型更改:

var MyView = Backbone.View.extend({

  initialize: function(){
    this.listenTo(this.model, "change", this.compareToDefaults);
  },
  compareToDefaults: function(model){
    // here, you can compare each model value with the default ones.
    // and display or not display your RESET button.
  }
});