16

根据我的理解,Backbone.js 模型的属性应该通过以下方式声明为有点私有的成员变量

this.set({ attributeName: attributeValue })
// accessing the value
this.get('attributeName');

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

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

另外我会假设后一个版本处理起来会更快,因为它不经过backbone.js的事件管理。

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

4

2 回答 2

55

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

您应该使用getandset来访问模型的数据。这意味着作为模型序列化表示的一部分的任何属性都使用 检索fetch和持久化save

何时使用model.attributes.property

绝不。

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

尽管直接访问属性而不是get它本身是无害的,但应该避免这种情况,以便attributes可以将对象视为完全、完全私有的。

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

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

何时使用model.property

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

this._privateProperty = 'foo';
this.publicProperty = 'bar';
于 2013-03-21T13:34:41.997 回答
2

从不是一个不完整的答案。

有时您希望访问模型属性的集合——无论这些属性是什么。考虑一种实用方法来对属性执行计算、格式化它们以进行输出等。

一个方便的方法是访问 model.attributes

考虑一种替代方案,如下:

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

callSomeUtilityMethod(attributes);

两个问题:

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

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

callSomeUtilityMethod(model.attributes);
于 2013-10-11T17:06:29.593 回答