Backbone.js - 自定义setter

时间:2011-10-20 21:18:29

标签: javascript backbone.js

想象一下像

这样的简单主干模型
window.model= Backbone.Model.extend({
   defaults:{
      name: "",
      date: new Date().valueOf()
   }
})

我正试图找到一种方法,无论输入提供什么,总是使模型存储名称为小写。即,

model.set({name: "AbCd"})
model.get("name") // prints "AbCd" = current behavior
model.get("name") // print "abcd" = required behavior

这样做的最佳方法是什么?以下是我能想到的全部内容:

  1. 覆盖“设置”方法
  2. 使用“SantizedModel”侦听此基本模型的更改并存储已清理的输入。然后,所有视图代码都将通过此清理模型传递。
  3. 我提到的特定的“小写”示例在技术上可以在检索时更好地处理视图,但想象一个不同的情况,例如,用户在Pounds中输入值,我只想在$ s中存储值我的数据库。同一模型可能也有不同的观点,我不想在任何地方使用“toLowerCase”。

    思想?

3 个答案:

答案 0 :(得分:10)

更新:您可以使用插件:https://github.com/berzniz/backbone.getters.setters


您可以像这样覆盖set方法(将其添加到模型中):

set: function(key, value, options) {
    // Normalize the key-value into an object
    if (_.isObject(key) || key == null) {
        attrs = key;
        options = value;
    } else {
        attrs = {};
        attrs[key] = value;
    }

    // Go over all the set attributes and make your changes
    for (attr in attrs) {
        if (attr == 'name') {
            attrs['name'] = attrs['name'].toLowerCase();
        }
    }

    return Backbone.Model.prototype.set.call(this, attrs, options);
}

答案 1 :(得分:5)

这将是一个黑客,因为这不是它的目的,但你总是可以使用验证器:

window.model= Backbone.Model.extend({
   validate: function(attrs) {
      if(attrs.name) {
         attrs.name = attrs.name.toLowerCase()
      }

      return true;
   }
})

在模型中设置值之前,将调用validate函数(只要未设置silent选项),这样就可以在数据真正设置之前改变数据。

答案 2 :(得分:3)

不是为了自己的号角,而是I created a Backbone model用“Computed”属性来解决这个问题。换句话说

var bm = Backbone.Model.extend({
  defaults: {
     fullName: function(){return this.firstName + " " + this.lastName},
     lowerCaseName: function(){
        //Should probably belong in the view
        return this.firstName.toLowerCase();  

     }
   }
})

您还可以监听计算属性的更改,并将其视为常规属性。

The plugin Bereznitskey mentioned也是一种有效的方法。