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
Какой лучший способ сделать это? Здесь все, о чем я мог подумать:
- Переопределить метод "set"
- Используйте "SantisedModel", который прослушивает изменения в этой базовой модели и сохраняет дезинфицированные входы. Тогда весь код представления будет передан этой санированной моделью.
Конкретный пример "в нижнем регистре", о котором я упоминал, технически может быть лучше обработан представлением при его изъятии, но представьте себе другой случай, когда, скажем, пользователь вводит значения в фунтах, и я хочу хранить значения в $s в моя база данных. Также могут быть разные представления для одной и той же модели, и я не хочу использовать "toLowerCase" везде, где он используется.
Мысли?
Ответы
Ответ 1
UPDATE: вы можете использовать плагин: 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);
}
Ответ 2
Это будет взлом, потому что это не то, для чего он был создан, но вы всегда можете использовать валидатор для этого:
window.model= Backbone.Model.extend({
validate: function(attrs) {
if(attrs.name) {
attrs.name = attrs.name.toLowerCase()
}
return true;
}
})
Функция проверки будет вызвана (пока параметр silent
не будет установлен) до того, как значение будет задано в модели, так что вы дадите вам возможность мутировать данные до того, как они действительно будут установлены.
Ответ 3
Не использовать свой собственный рог, но Я создал модель Backbone с параметрами "Вычисленные", чтобы обойти это. Другими словами
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();
}
}
})
Вы также слушаете изменения в вычисленных свойствах и в значительной степени рассматриваете это как обычный.
Плагин Bereznitskey, упомянутый, также является допустимым подходом.