首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >backbone.js访问模型中的模型属性- this.attribute与this.get('attribute')?

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

Stack Overflow用户
提问于 2013-03-21 19:03:52
回答 2查看 21.6K关注 0票数 16

据我所知,Backbone.js模型的属性应该声明为一些私有成员变量,方法是

代码语言:javascript
复制
this.set({ attributeName: attributeValue })
// accessing the value
this.get('attributeName');

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

代码语言:javascript
复制
this.attributeName = attributeValue;
// accessing the value
this.attributeName;

此外,我假设后一个版本的处理速度会更快,因为它不需要通过Backbone.js的事件管理。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-21 21:34:42

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

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

何时使用 model.attributes.property

绝不可能。

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

尽管直接访问属性而不是get本身是非常无害的,但是应该避免这样做,这样attributes对象就可以被认为是完全、完全私有的。

如果您绝对需要防止某些更改触发事件,则可以使用silent:true选项:model.set({key:val}, {silent:true})。这确实破坏了前面提到的契约,甚至Backbone自己的文档也给出了以下警告:

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

何时使用 model.property

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

代码语言:javascript
复制
this._privateProperty = 'foo';
this.publicProperty = 'bar';
票数 55
EN

Stack Overflow用户

发布于 2013-10-12 01:06:30

Never是一个不完整的答案。

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

要做到这一点,一个方便的方法是访问model.attributes

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

代码语言:javascript
复制
var attributesNames = ['foo', 'bar', 'baz'];
var attributes = _(attributesNames ).map(function(attr) { return model.get(attr); });

callSomeUtilityMethod(attributes);

两个问题:

  • 我们已经在"attributeNames“集合中引入了耦合。如果列表改变了怎么办?
  • 我们已经失去了名称/值的关联。我们可以重写上面的地图,但它会变得更多工作。

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

代码语言:javascript
复制
callSomeUtilityMethod(model.attributes);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15545697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档