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