2

似乎有许多不同的方法可以访问 Sencha (Touch) 模型的属性。但是,我似乎无法找到正确的文档,哪些是“正确”的做法。

模型创建

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无论模型定义中的数据类型是什么,似乎总是返回一个字符串?
4

1 回答 1

3

让我们整理一下:

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

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

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

  • model['name']: 正如你所说,它不起作用。不要希望它回来(我什至不明白它在某一时刻有效)。

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

在大多数情况下,该model.data对象应该为您提供预期的结果(见下文),并且应该为您提供其他调用函数的边际性能增益。

但是,IMO 您应该始终更喜欢使用 getter 和 setter,原因有两个。

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

其次,getter 和 setter 使调试某些情况变得非常容易,因为它可以很容易地知道模型值的修改来自何处。我的意思是,如果有一天你问自己“f**k,为什么我的模型字段值会变成这个??”。如果所有代码都使用 getter,那么您只需在其中放置一个断点,您就会将罪魁祸首捉到囊中。另一方面,如果被指控的代码data直接使用该对象,您将被困在整个项目中搜索...您无法确切知道是什么... data.name =data['name'] =? name:? 等等

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

简短的回答:使用访问器。

于 2013-09-20T07:53:11.287 回答