Ember.get()和this.get()之间的区别

Bal*_*dar 11 ember.js

我是Ember的新手,它一直让我困惑于this.get()和之间的区别Ember.get().有人能简单解释一下吗?

Pav*_*vol 25

欢迎来到Ember ;-)

扩展Ember Observable mixin的每个对象都支持该get()方法(以及其他).

当你调用时this.get(),this必须引用这样一个对象(Route,Controller,Component,你自己的扩展Ember.Object的类等等).调用get()普通对象会导致失败.让我说明一下差异:

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
Run Code Online (Sandbox Code Playgroud)

但是,Ember.get()在两种情况下都使用成功:

Ember.get(emberObjectInstance, 'name'); // returns 'Bala'
Ember.get(plainObject, 'name');         // returns 'Bala', too
Run Code Online (Sandbox Code Playgroud)

也可以用导入编写如下

import { get } from '@ember/object';

get(emberObjectInstance, 'name'); // returns 'Bala'
get(plainObject, 'name');         // returns 'Bala', too
Run Code Online (Sandbox Code Playgroud)

注意:不要忘记,调用其中任何一个get()使得计算属性得到计算(在最常见的情况下,我现在不想深入研究 - 懒惰计算,易变扩展等),但为了理解差异,我们可以使用普通价值观.

根据自己的经验,我在Ember.get()任何地方使用我知道普通对象可能是我需要检索其属性的对象.一个很好的例子是setupController()钩子,我可以将单个测试中的普通对象传递给测试setupController()的功能.

// 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");
...
Run Code Online (Sandbox Code Playgroud)

我也可以使用Ember.set(controller, 'isNamePresentOnSetup', Ember.isPresent(name)),然后通过普通的控制器模拟setupController().

我认为这是一个很好的开始,因为你是Ember的新人,我相信Ember大师会有更多的补充.相关的Ember文档:

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')if bundefined返回值是undefined.将此转换为objectInstance.a.b.cb undefined将改为引发异常.