Backbone: 自定义视图属性在不同实例之间共享

创建于 2012-04-19  ·  9评论  ·  资料来源: jashkenas/backbone

请查看此小提琴: http :

因此,我们将创建10个itemView实例,并调用addItem方法将10个项目添加到每个itemView中。 每个itemView的itemArray属性中应包含10个项目。 但是相反,它们共享itemArray属性,并且其中包含100个项目。

问题可能出于骨架.view没有重置构造函数中的自定义属性。

question

最有用的评论

是的,因为itemArrayitemView原型的属性,所以它被itemView所有实例共享。 如果您希望实例具有自己的itemArray ,则应在initialize或构造函数中进行设置。

var ItemView = Backbone.View.extend({

  initialize: function() {
    this.itemArray = [];
  },

  ...

});

所有9条评论

是的,因为itemArrayitemView原型的属性,所以它被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的文章,而且我相信所有内容都会变得清楚:)。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

rafde picture rafde  ·  9评论

omenking picture omenking  ·  10评论

etler picture etler  ·  13评论

rubiii picture rubiii  ·  12评论

tribalvibes picture tribalvibes  ·  11评论