backbone.js访问模型中的模型属性 - this.attribute VS this.get('attribute')?

时间:2013-03-21 11:03:52

标签: backbone.js model

根据我的理解,Backbone.js模型的属性应该通过说

声明为私有成员变量。
this.set({ attributeName: attributeValue })
// accessing the value
this.get('attributeName');

但是当我在实际模型中编写函数时,这样说似乎更简单:

this.attributeName = attributeValue;
// accessing the value
this.attributeName;

此外,我认为后一版本的处理速度会更快,因为它不会通过backbone.js的事件管理。

所以我想知道专业人员如何处理主要在模型内部使用的属性。这些是人们实际上希望与外界有点屏蔽的属性,因此在后一个示例中将它们暴露出来可能不是正确的。当我一直在查看没有get和set方法的backbone.js视图的例子时,在第二个例子中似乎很好。那么在模型中编码时使用get / set(attribute)或this.attribute是否有任何好的经验法则?或者也许是一个让这个更清晰的模型的例子?

2 个答案:

答案 0 :(得分:55)

何时使用model.get(property)model.set(...)

您应该使用getset来访问模型的数据。这意味着属于模型序列化表示的任何属性,使用fetch检索并使用save保留。

何时使用model.attributes.property

从不。

您应该始终使用get,尤其是set,而不是直接访问model.attributes对象,尽管我已经看到了相互矛盾的意见。我相信model和它的消费者之间存在合同,这保证了使用change事件可以通知消费者对模型数据的任何更改。如果直接修改内部属性对象,则不会发送事件并且此合同将被破坏。 Backbone事件非常快,特别是如果你没有附加任何监听器,并且这不是一个可以从你的过度优化中获益的一点。

虽然直接访问属性而不是get对它本身来说是非常无害的,但应该避免这样做,因此可以认为attributes对象完全是私有的。

如果您绝对需要阻止某些更改触发事件,可以使用silent:true选项:model.set({key:val}, {silent:true})。这确实打破了上述合同,甚至Backbone自己的文档都给出了以下警告:

  

请注意,这很少,甚至从来都不是一个好主意。通过选项中的特定标志来查看事件回调,并选择忽略,通常会更好。

何时使用model.property

not data 的任何属性,即临时状态变量,计算属性等,都可以直接附加到模型实体。这些属性应该被认为是临时的和可传递的:它们可以在模型初始化时或在其生命周期中重新创建,但它们不应该被持久化,无论是公共的还是私有的。典型的命名约定是使用_字符为私有属性添加前缀,如下所示:

this._privateProperty = 'foo';
this.publicProperty = 'bar';

答案 1 :(得分:2)

永远不是一个不完整的答案。

有时您希望访问模型属性的集合 - 无论这些属性是什么。考虑一种实用方法,用于对属性执行计算,为输出格式化等等。

执行此操作的便捷方法是访问model.attributes

考虑下面的一个替代方案:

var attributesNames = ['foo', 'bar', 'baz'];
var attributes = _(attributesNames ).map(function(attr) { return model.get(attr); });

callSomeUtilityMethod(attributes);

两个问题:

  • 我们在“attributeNames”集合中引入了耦合。如果该列表发生变化怎么办?
  • 我们失去了名称/价值的关联。我们可以重写上面的地图,但它会变得更有效。

在这种情况下,做这样的事情要方便得多:

callSomeUtilityMethod(model.attributes);