Backbone.js - custom setters

前端 未结 3 885
说谎
说谎 2021-02-19 08:44

Imagine a simple backbone model like

window.model= Backbone.Model.extend({
   defaults:{
      name: \"\",
      date: new Date().valueOf()
   }
})
相关标签:
3条回答
  • 2021-02-19 09:12

    UPDATE: you can use the plug-in: https://github.com/berzniz/backbone.getters.setters


    You can override the set method like this (add it to your models):

    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);
    }
    
    0 讨论(0)
  • 2021-02-19 09:15

    Not to toot my own horn, but I created a Backbone model with "Computed" properties to get around this. In other words

    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();  
    
         }
       }
    })
    

    You also listen for changes on computed properties and pretty much just treat this as a regular one.

    The plugin Bereznitskey mentioned is also a valid approach.

    0 讨论(0)
  • 2021-02-19 09:38

    It would be a hack, because this isn't what it was made for, but you could always use a validator for this:

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

    The validate function will get called (as long as the silent option isn't set) before the value is set in the model, so it gives you a chance to mutate the data before it gets really set.

    0 讨论(0)
提交回复
热议问题