2

我想取消设置以相同子字符串开头的 Backbone.js 模型的所有属性,例如:

logo_id
logo_width
logo_height

我想做类似的事情:

model.unsetAllStartsWith('logo');

代码将类似于:

_.extend(Backbone.Model, {
    unsetAllStartsWith : function(str){
        // something with this.toJSON() ?
    }
});

我对模型和 toJSON 感到困惑。另外,这是扩展 Backbone 模型类的正确方法吗?

4

3 回答 3

4

Backbone.Model 有一个内置的 extend 方法,所以你可以这样做:

var MyModel = Backbone.Model.extend({
    unsetAllStartsWith: function(str){
       // get clone of attributes to iterate over
       var attrs = _.clone(this.attributes);
       _.each(attrs, function(val, key){
              if(key.indexOf(str) == 0){
                  this.unset(key);
              }
           }, this);
    }
});

var model = new MyModel({logo_width: 100, logo_height: 200});
model.unsetAllStartsWith('logo');
于 2013-02-25T20:36:28.820 回答
2

试试这个。

unsetAllStartsWith:函数(str){
        var $this = 这个
        var 属性 = Object.keys($this.toJSON());
        _.each(属性,函数(属性){
            var regex = new RegExp('^'+ str, 'gi')
            如果(属性。匹配(正则表达式))
               $this.unset(属性)        
        }

      }

}
于 2013-02-25T20:37:26.683 回答
1

这是添加方法( jsfiddle )的稍微不同的看法:

Backbone.Model.prototype.unsetAllStartsWith = function(prefix) {
    var that = this;
    _.each(this.attributes, function(attrVal, attrName) {
      if (attrName.slice(0,prefix.length) === prefix) {
          that.unset(attrName);
      }
  })
};

像这样使用:

var MyModel = Backbone.Model.extend({
    defaults: {
        'foo_first': 'bar',
        'foo_second': 'bar2',
        'different': 'bar3'
    }
});

var testModel = new MyModel();
testModel.unsetAllStartsWith('foo');
于 2013-02-26T00:11:36.703 回答