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

时间:2013-09-20 07:26:50

标签: javascript extjs sencha-touch sencha-touch-2

如何访问Sencha(Touch)模型的属性似乎有许多不同的方法。但是,我似乎无法找到适当的文档,说明哪种方法是“正确的”。

模型创建

var model = Ext.create('MyApp.model.MyModel', {
  name: value,
  foo: bar,
  ...
})

财产权限

  • model.get('name')model.set('name', newValue)
  • model.data.namemodel.data.name = newValue
  • 无论模型定义中的数据类型是什么,
  • model.raw.name似乎总是返回一个字符串?

1 个答案:

答案 0 :(得分:3)

让我们全力以赴:

  • getset方法是模型字段值的预期访问者。

  • model.data是存储客户端模型值的对象,即使用字段配置从 server 代理接收的数据转换的类型(类型,转换方法等。)

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

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

现在,您应该使用哪一个?显然,最后两个已经不在比赛中了。

model.data对象应该在大多数情况下给你预期的结果(见下文),并且应该给你一个边际性能增益,而不是调用函数。

然而,IMO你应该总是喜欢使用getter和setter,原因有两个。

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

其次,getter和setter使调试某些情况变得更加容易,方便的是可以从模型值的修改位置来了解。我的意思是,如果有一天你会问自己“f ** k,为什么我的模型字段值会改变为这个?”。如果所有代码都使用了getter,那么你只需要在那里放一个断点,然后你就会抓住罪魁祸首。另一方面,如果被控制的代码直接使用data对象,那么您将无法进行整个项目搜索......您无法确切地知道什么...... data.name =data['name'] =name:?等

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

简短回答:使用访问者。