js访问模型内的模型属性?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

根据我的理解,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(属性)或this.属性时有什么好的经验法则吗?或者是一个模型的例子,让这个模型更清晰?

提问于
用户回答回答于

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

应该使用getset访问模型的数据。这意味着属于模型序列化表示的任何属性,这些属性是使用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';
用户回答回答于

考虑以下一种备选办法:

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

callSomeUtilityMethod(attributes);

两个问题:

  • 我们在“属性名称”集合中引入了耦合。如果名单变了呢?
  • 我们失去了名称/价值的联系。我们可以重写上面的地图,但它需要更多的工作。

在这个场景中,这样做要方便得多:

callSomeUtilityMethod(model.attributes);

所属标签

可能回答问题的人

  • 不吃貓的鱼oo

    5 粉丝466 提问6 回答
  • Richel

    8 粉丝0 提问4 回答
  • 人生的旅途

    10 粉丝484 提问3 回答
  • 云服务小能手

    0 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励