想象一下像
这样的简单主干模型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
这样做的最佳方法是什么?以下是我能想到的全部内容:
我提到的特定的“小写”示例在技术上可以在检索时更好地处理视图,但想象一个不同的情况,例如,用户在Pounds中输入值,我只想在$ s中存储值我的数据库。同一模型可能也有不同的观点,我不想在任何地方使用“toLowerCase”。
思想?
答案 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也是一种有效的方法。