Ember.get() 和 this.get() 的区别 [英] Difference between Ember.get() and this.get()
问题描述
我是 Ember 的新手,它让我一直对 this.get()
和 Ember.get()
之间的区别感到困惑.有人能简单解释一下吗?
I'm new to Ember and it keeps confusing me about the difference between this.get()
and Ember.get()
. Can someone explain them briefly?
推荐答案
欢迎使用 Ember ;-)
Welcome to Ember ;-)
扩展 Ember Observable mixin 支持 get()
方法(等等).
Every object that extends Ember Observable mixin supports the get()
method (among others).
当您调用 this.get()
时,this
必须引用这样一个对象(Route、Controller、Component、您自己的扩展 Ember.Object 和很快).在普通对象上调用 get()
会导致失败.让我展示一下区别:
When you call this.get()
, the this
must refer to such an object (Route, Controller, Component, your own class that extends Ember.Object and so on). Calling get()
on plain object would cause a failure. Let me show the difference:
const emberObjectInstance = Ember.Object.create({
name: 'Bala'
});
emberObjectInstance.get('name'); // returns 'Bala'
const plainObject = { name: 'Bala'};
plainObject.get('name'); // causes a failure since get() is not a function
然而,在两种情况下使用 Ember.get()
都成功了:
However, using Ember.get()
successes in both cases:
Ember.get(emberObjectInstance, 'name'); // returns 'Bala'
Ember.get(plainObject, 'name'); // returns 'Bala', too
也可以用imports写成如下
which can be also written with imports as follows
import { get } from '@ember/object';
get(emberObjectInstance, 'name'); // returns 'Bala'
get(plainObject, 'name'); // returns 'Bala', too
注意:不要忘记,调用 get()
中的任何一个都会使计算属性得到计算(在最常见的情况下,我现在不想深入研究 - 懒惰计算、易失性扩展等),但为了理解差异,我们可以使用普通值.
Note: not to forget, calling either of get()
makes computed property get computed (in the most common cases, I don't want to dive deep now - lazy computation, volatile extensions etc), but for the sake of understanding the difference, we can work with plain values.
根据自己的经验,我在任何地方都使用 Ember.get()
我知道一个普通对象可能是我需要检索其属性的对象.一个很好的例子是 setupController()
钩子,我可以将单元测试中的普通对象传递到其中来测试 setupController()
的功能.
From own experience, I am using Ember.get()
everywhere I know a plain object might be the object whose property I need to retrieve. A nice example is setupController()
hook into which I may pass plain object from my unit tests to test setupController()
's functionality.
// some route:
setupController(controller, model){
this._super(...arguments);
const name = Ember.get(model, 'name'); // ***
controller.set('isNamePresentOnSetup', Ember.isPresent(name));
}
// in my unit tests I can use plain object:
...
const modelMock = { name: 'Bala' }; // plain object is enough because I use Ember.get instead of model.get() (see ***)?
const controllerMock = Ember.Object.create(); // has to be Ember.Object since I use controller.set() within setupController()
subject.setupController(controllerMock, modelMock);
assert.ok(controllerMock.get('isNamePresentOnSetup'), "property 'isNamePresentOnSetup' set up correctly if model name is present");
...
我也可以使用 Ember.set(controller, 'isNamePresentOnSetup', Ember.isPresent(name))
然后将普通控制器模拟传递给 setupController()
.
I could also user Ember.set(controller, 'isNamePresentOnSetup', Ember.isPresent(name))
and then pass plain controller mock into setupController()
, too.
我认为这是一个好的开始,因为您是 Ember 的新手,而且我相信 Ember 大师会添加更多内容.相关 Ember 文档:
I think this is a good start since you are new in Ember and I am sure Ember gurus would have much more to add. Relevant Ember docs:
https://guides.emberjs.com/v2.9.0/object-model/
https://guides.emberjs.com/v2.9.0/object-model/computed-properties/
https://guides.emberjs.com/v2.9.0/object-model/reopening-classes-and-instances/
更新:使用 get()
和 链接路径 的工作方式与使用 POJO 不同.例如在 objectInstance.get('a.b.c')
中,如果 b
是 undefined
,则返回值是 undefined
.当 b 是 undefined
时,将其转换为 objectInstance.a.b.c
会引发异常.
UPDATE:
Using get()
with chained paths works different than working with POJOs.
For example in objectInstance.get('a.b.c')
if b
is undefined
the return value is undefined
. Converting this to objectInstance.a.b.c
when b is undefined
would instead raise an exception.
这篇关于Ember.get() 和 this.get() 的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!