根据我的理解,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是否有任何好的经验法则?或者也许是一个让这个更清晰的模型的例子?
答案 0 :(得分:55)
何时使用model.get(property)
和model.set(...)
您应该使用get
和set
来访问模型的数据。这意味着属于模型序列化表示的任何属性,使用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);
两个问题:
在这种情况下,做这样的事情要方便得多:
callSomeUtilityMethod(model.attributes);