实例化覆盖以前的实例(Backbone.js 模型)
Instantiation Overwriting Previous Instances (Backbone.js Models)
我似乎对这个小片段有疑问。我已经摆弄它很长一段时间了,当同名的全局属性在同一模型的下一个实例化时发生更改时,它会不断覆盖所有先前实例化的全局属性。
这个问题的影响是破坏了我正在构建的一个简单的网络导航编辑器,每次获取一个集合时,即使它们是同一集合类型的单独实例,它们也会覆盖任何其他模型由于全局变量被覆盖的集合。
不用说,我已经用头撞墙三天了,无法弄清楚,也无法在 Google 上找到与此类问题相关的任何内容。非常感谢任何对此问题的帮助。
JSFiddle:http://jsfiddle.net/alexgurrola/ruv11nkn/
// Create Example Model
var Model = Backbone.Model.extend({
globals: {
attributes: {},
set: function (prop, value) {
this.attributes[prop] = value;
},
get: function (prop) {
return this.attributes[prop]
},
has: function (prop) {
return _.has(this.attributes, prop);
},
iterate: function (prop) {
if (!this.has(prop)) this.set(prop, 0);
return ++this.attributes[prop];
}
},
local: "Unknown"
});
// Create First Instance
var Instance = new Model();
Instance.local = "Instance";
Instance.globals.set("name", "Instance");
// Create Second Instance, which will Overwrite the First, Unintentionally
var Overwrite = new Model();
Overwrite.local = "Overwrite";
Overwrite.globals.set("name", "Overwrite");
因为您的 global
对象是用 Model
声明的,所以上下文绑定到该对象,而不是您稍后创建的实例。它基本上就像一个静态变量,所以每个实例都将引用相同的 attributes
对象。
您似乎想要的是让模型的每个实例都有自己的attributes
,您可以这样做,例如,通过在初始化函数中设置它来代替
var Model = Backbone.Model.extend({
initialize: function () {
this.globals = {
attributes: {},
set: function (prop, value) {
this.attributes[prop] = value;
},
get: function (prop) {
return this.attributes[prop]
},
has: function (prop) {
return _.has(this.attributes, prop);
},
iterate: function (prop) {
if (!this.has(prop)) this.set(prop, 0);
return ++this.attributes[prop];
}
}
}
});
这将确保每个实例创建自己的 globals
并且在调用 set
时正确绑定上下文。
不过我有点好奇你为什么要这样做。您好像是在模型中重新实现模型?
我似乎对这个小片段有疑问。我已经摆弄它很长一段时间了,当同名的全局属性在同一模型的下一个实例化时发生更改时,它会不断覆盖所有先前实例化的全局属性。
这个问题的影响是破坏了我正在构建的一个简单的网络导航编辑器,每次获取一个集合时,即使它们是同一集合类型的单独实例,它们也会覆盖任何其他模型由于全局变量被覆盖的集合。
不用说,我已经用头撞墙三天了,无法弄清楚,也无法在 Google 上找到与此类问题相关的任何内容。非常感谢任何对此问题的帮助。
JSFiddle:http://jsfiddle.net/alexgurrola/ruv11nkn/
// Create Example Model
var Model = Backbone.Model.extend({
globals: {
attributes: {},
set: function (prop, value) {
this.attributes[prop] = value;
},
get: function (prop) {
return this.attributes[prop]
},
has: function (prop) {
return _.has(this.attributes, prop);
},
iterate: function (prop) {
if (!this.has(prop)) this.set(prop, 0);
return ++this.attributes[prop];
}
},
local: "Unknown"
});
// Create First Instance
var Instance = new Model();
Instance.local = "Instance";
Instance.globals.set("name", "Instance");
// Create Second Instance, which will Overwrite the First, Unintentionally
var Overwrite = new Model();
Overwrite.local = "Overwrite";
Overwrite.globals.set("name", "Overwrite");
因为您的 global
对象是用 Model
声明的,所以上下文绑定到该对象,而不是您稍后创建的实例。它基本上就像一个静态变量,所以每个实例都将引用相同的 attributes
对象。
您似乎想要的是让模型的每个实例都有自己的attributes
,您可以这样做,例如,通过在初始化函数中设置它来代替
var Model = Backbone.Model.extend({
initialize: function () {
this.globals = {
attributes: {},
set: function (prop, value) {
this.attributes[prop] = value;
},
get: function (prop) {
return this.attributes[prop]
},
has: function (prop) {
return _.has(this.attributes, prop);
},
iterate: function (prop) {
if (!this.has(prop)) this.set(prop, 0);
return ++this.attributes[prop];
}
}
}
});
这将确保每个实例创建自己的 globals
并且在调用 set
时正确绑定上下文。
不过我有点好奇你为什么要这样做。您好像是在模型中重新实现模型?