是的,因为itemArray
是itemView
原型的属性,所以它被itemView
所有实例共享。 如果您希望实例具有自己的itemArray
,则应在initialize
或构造函数中进行设置。
var ItemView = Backbone.View.extend({
initialize: function() {
this.itemArray = [];
},
...
});
这是做您所描述的小提琴: http :
嗨@braddunbar ,
我们已经使用了与发布的解决方案相同的解决方案,但似乎我们不需要这样做。 您觉得这很令人困惑吗?
您能解释一下在原型上使用它有什么用吗(我不太明白,我并不是说当前的实现是不正确的,只是试图弄清楚一点以便我们能够理解)。
我们通常用@spawnedc在他的提琴中使用的方式来指定视图的所有属性,因为这样一来,便可以清楚地查看视图的属性,如果我们随后不得不在initialize方法中“覆盖”它们的话,这似乎很麻烦。
在示例应用程序中,以完全相同的方式指定views属性(请参阅Todo.js)。 以相同的方式指定“模板”变量,但是当然,因为它只是一个不变的字符串,所以我们从来没有遇到过这种问题。
指定动态视图属性的正确方法是什么,肯定不是我们必须在init方法中全部覆盖它们的情况吗?
你能解释一下在原型上使用它有什么用吗
根据我的经验,在原型上放置可变属性(数组,哈希等)很少有用(尽管我确信其中有一些实例)。
指定动态视图属性的正确方法是什么,肯定不是我们必须在init方法中全部覆盖它们的情况吗?
是的,要在类/构造函数的每个实例上设置一个具有可变值的属性,您应该在构造函数中进行设置(或在本例中,从构造函数调用initialize
)。
例如,这是Backbone在Backbone.Model
实例中设置属性的方式。
@braddunbar如果创建_new_实例,我希望_all_属性将被重置,因为它是_brand new_实例。 这不是预期的行为还是我错过了一些东西?
嗨@braddunbar ,
根据我的经验,在原型上放置可变属性(数组,哈希等)很少有用(尽管我确信其中有一些实例)。
在这种情况下,这不是Bacbone对itemArray所做的事情吗? itemArray在原型上,这就是为什么我们正在经历的行为正在发生?
我100%同意@spawnedc的最后声明。 我不希望在“同级”视图实例之间共享任何属性。
实际上,除非在构造函数中将其重置,否则不会重置任何属性。 它们始终是相同构造器创建的所有实例共享的相同原型属性。
var A = function(){};
var a = new A();
var B = function(){};
B.prototype = a;
a.constructor = B;
var b1 = new B();
var b2 = new B();
console.log(b1.foo); // undefined
console.log(b2.foo); // undefined
a.foo = [1];
console.log(b1.foo); // [1]
console.log(b2.foo); // [1]
console.log(b1.foo === b2.foo); // true
如果你有兴趣有一个很好的解释在这里。
在这种情况下,这不是Bacbone对itemArray所做的事情吗? itemArray在原型上,这就是为什么我们正在经历的行为正在发生?
究竟。 这就是为什么我建议在initialize
创建itemArray
initialize
而不是将其作为原型属性的原因。
@braddunbar感谢您的解释和链接-一方面,这仍然是一种怪异(且出乎意料)的行为,但另一方面,在视图之间共享属性是完全有意义的。
我将阅读JavaScript Garden的文章,而且我相信所有内容都会变得清楚:)。
最有用的评论
是的,因为
itemArray
是itemView
原型的属性,所以它被itemView
所有实例共享。 如果您希望实例具有自己的itemArray
,则应在initialize
或构造函数中进行设置。