我遇到了非常不愉快的情况。
这是模型初始化的代码:
var Model = Backbone.Model = function(attributes, options) {
var attrs = attributes || {};
options || (options = {});
this.cid = _.uniqueId('c');
this.attributes = {};
if (options.collection) this.collection = options.collection;
if (options.parse) attrs = this.parse(attrs, options) || {};
attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
this.set(attrs, options);
this.changed = {};
this.initialize.apply(this, arguments);
};
这里的问题是,当模型在 init 上获取属性映射时,如果属性已经存在,它会忽略默认值,并且在设置传递给构造函数的内容之前不会设置默认值。
逻辑上认为我希望总是在初始化的一开始就设置默认值,然后在调用“set”方法时替换值,这样我可以覆盖“set”方法来处理数组类型属性并将它们转换为这样的集合:
set: function () {
var firstArgument = arguments[0],
attributesMap;
if (_.isObject(firstArgument)) {
//setting with attributes map
attributesMap = firstArgument;
_.each(attributesMap, function (value, attribute) {
var modelAttribute = this.attributes[attribute];
if (modelAttribute && modelAttribute instanceof Backbone.Collection) {
modelAttribute.reset(value);
delete attributesMap[attribute];
}
}, this);
}
return Backbone.Model.prototype.set.apply(this, arguments);
}
现在我正在做的是检查默认属性是否是 Backbone.Collection 的实例,如果是,我使用给定的数组值重置集合(保持相同的集合引用并允许视图或其他数据对象监听该集合)并阻止它被常规数组覆盖。
由于我之前在调用“set”方法时描述的问题,它没有默认属性,我无法检查我想要操作的属性类型是什么。
您如何处理作为数组的属性并且应该被转换并视为 Backbone.Collection?
现在我只是改变了“默认”函数的作用,而不是返回属性对象,我这样做:
defaults: function () {
this.attributes = {
...
};
}