学习Ember.js并通过Ruby和Java对getter和setter(访问器)有一个合理的理解。
在Ember / Javascript中,我似乎非常缺乏理解。例如,在我的控制器/模型中,我不知道是使用object.set(property,value)
还是直接引用它们object.property = 'value'
例如,在我之前的问题(How to get Model values in Controller)中,部分工作回答是使用object.name
而不是object.get('name')
。它有效,但我错过了基本的理解。
希望得到一些澄清。
答案 0 :(得分:0)
这就是Javascript的工作方式,这是它的缺点之一。它没有公共/私人礼仪或方法。因此,我们应该依赖代码中的好评。
我不是Ember的专家,但是当我面对JS中的类似问题时,我通常会查看库的源代码,看看它是如何构建的,然后做出决定。这就是为什么js库通常都带有min和dev版本。
但是,如果对象具有访问其属性的特殊方法,那么它们是有原因的,因此使用它们而不是直接访问属性。如上所述,在Js中,您不能将属性设为私有或受保护。
答案 1 :(得分:0)
规则是:当您在.js文件中时,应始终使用.get()/.set()
。当你在模板(.hbs或其他)中时,你不应该(你不能这样做)。
如果您通过myObj.myProp
访问属性,它将适用于常规属性,但计算属性不会。如果您通过myObj.myProp
设置属性,您仍然可以返回值,但不会通知绑定和观察者它已更改并且无法正确更新。
这是Ember团队的一项设计决策,它允许有效的绑定/观察者,而不是对所有绑定/观察到的属性进行脏检查(这是Angular目前所做的)。
我做了一个小jsbin显示这个。最初绑定了三个值,然后按钮更改一个并将其记录到控制台中(因此请确保控制台处于打开状态),绑定不会更新,但可以检索该值。然后,它尝试通过myObj.myProp
获取计算属性,该属性返回undefined,然后是常规方式。
http://emberjs.jsbin.com/cipapaxevi/2/
另外,作为旁注。如果您希望子对象上的属性与您拥有的属性相同,则可以通过myObj.get('myProp.myOtherProp')
访问它而不是myObj.get('myProp').get('myOtherProp')
。它使您免于myProp
可能返回null
或undefined
的担忧。