Ember.get() 和 this.get() 的区别 [英] Difference between Ember.get() and this.get()

查看:35
本文介绍了Ember.get() 和 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') 中,如果 bundefined,则返回值是 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆