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, упомянутый, также является допустимым подходом.