Javascript 如何正确访问Sencha模型的属性?

Javascript 如何正确访问Sencha模型的属性?,javascript,extjs,sencha-touch,sencha-touch-2,Javascript,Extjs,Sencha Touch,Sencha Touch 2,似乎有许多不同的方法可以访问Sencha(触摸)模型的属性。然而,我似乎无法找到正确的文档,这是“正确”的方法 模型创建 var model = Ext.create('MyApp.model.MyModel', { name: value, foo: bar, ... }) 财产访问权 model.get('name')或model.set('name',newValue) model.data.name或model.data.name=newValue model.raw.n

似乎有许多不同的方法可以访问Sencha(触摸)模型的属性。然而,我似乎无法找到正确的文档,这是“正确”的方法

模型创建

var model = Ext.create('MyApp.model.MyModel', {
  name: value,
  foo: bar,
  ...
})
财产访问权

  • model.get('name')
    model.set('name',newValue)
  • model.data.name
    model.data.name=newValue
  • model.raw.name
    似乎总是返回字符串,而不管模型定义中的数据类型是什么

让我们把这一切整理一下:

  • get
    set
    方法是模型字段值的预期访问器

  • model.data
    是存储客户端模型值的对象,该值是使用字段配置(类型、转换方法等)从服务器代理接收的数据转换而来的

  • model.raw
    是从服务器代理接收的原始数据,在转换为客户端应用程序域模型值之前。您应该避免使用它,否则会将自己绑定到代理/服务器

  • model['name']
    :正如您所说,它不起作用。不要希望它回来(我甚至不知道它在某一点上起作用)

现在,你应该用哪一个?显然,最后两个已经出局了

model.data
对象在大多数情况下都会给您带来预期的结果(见下文),并且除了调用函数外,还会给您带来边际性能增益

然而,在我看来,出于两个原因,您应该总是更喜欢使用getter和setter

首先,您的团队中可能有人(或者您过去的团队成员)认为getter/setter是添加一些自定义逻辑的好方法。在这种情况下,直接使用
data
对象绕过访问器也将绕过此逻辑,并产生不可预测的结果

第二,getter和setter使调试某些情况变得更加容易,因为它们可以很容易地知道模型值的修改来自何处。我的意思是,如果有一天你问自己“f**k,为什么我的模型字段值变为这个??”。如果所有的代码都使用getter,那么您只需在其中放置一个断点,就可以抓住罪犯。另一方面,如果被指控的代码直接使用
数据
对象,您将不得不执行整个项目的搜索。。。你不知道到底是什么
data.name=
<代码>数据['name']=<代码>名称:?等等

现在我想起来了,还有另一个原因。显然是一个。但是
数据
对象名称过去可以使用此
persistenceProperty
选项进行自定义。因此,在某些情况下,
数据
对象甚至不可用,执行
model.data.name
而不是
model[model.persistenceProperty].name的代码会崩溃,简单明了


简短回答:使用访问器。

“…您团队中的某个人认为getter/setter是添加一些自定义逻辑的好方法”-然后,有人会遇到严重的问题,我们会告诉我。一个有副作用的接受者是不可接受的。不只是按原样返回值的getter不是getter,也不应该被称为getter。当然,如果有人不同意,可能会争论几个小时。这可能是getter的一个好策略,但setter通常用于规范化值,或根据新值更新对象的内部状态。例如,对于Ext模型,setter将更新字段的脏状态。