更新时间:2023-12-04 11:23:16
欢迎来到Ember; - )
扩展 Ember Observable的每个对象 mixin支持 get()
方法(等等)。
当您调用 this.get()
,这个
必须引用这样一个对象(Route,Controller,Component,你自己的类扩展Ember .Object等)。在普通对象上调用 get()
会导致失败。让我展现出区别:
const emberObjectInstance = Ember.Object.create({
name:'Bala'
});
emberObjectInstance.get('name'); // return'Bala'
const plainObject = {name:'Bala'};
plainObject.get('name'); //因为get()不是一个函数导致失败
但是,使用 Ember.get()
成功的两种情况:
Ember.get(emberObjectInstance,'name ); //返回'Bala'
Ember.get(plainObject,'name'); //返回'Bala',也
注意:不要忘记,调用 get()
使计算属性得到计算(在最常见的情况下,我不想深入深度 - 懒惰计算,易失性扩展等),但为了理解差异我们可以使用明确的值。
从自己的经验来看,我正在使用 Ember.get()
知道一个简单的对象可能是我需要检索的属性的对象。一个很好的例子是 setupController()
钩子,我可以从我的单元测试中传递普通对象来测试 setupController()
的功能。
//某些路由:
setupController(controller,model){
this。 _super(...参数);
const name = Ember.get(model,'name'); // ***
controller.set('isNamePresentOnSetup',Ember.isPresent(name));
}
//在我的单元测试中我可以使用纯对象:
...
const modelMock = {name:'Bala'}; //纯对象是足够的,因为我使用Ember.get而不是model.get()(见***)?
const controllerMock = Ember.Object.create(); //必须是Ember.Object,因为我在setupController()中使用controller.set()
subject.setupController(controllerMock,modelMock);
assert.ok(controllerMock.get('isNamePresentOnSetup'),propertyName isNamePresentOnSetup'如果模型名称正确设置);
...
我也可以使用 Ember.set控制器,'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 /
I'm new to Ember and it keeps confusing me about the difference between this.get() and Ember.get(). Can someone explain them briefly?
Welcome to Ember ;-)
Every object that extends Ember Observable mixin supports the get()
method (among others).
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
However, using Ember.get()
successes in both cases:
Ember.get(emberObjectInstance, 'name'); // returns 'Bala'
Ember.get(plainObject, 'name'); // returns 'Bala', too
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.
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");
...
I could also user Ember.set(controller, 'isNamePresentOnSetup', Ember.isPresent(name))
and then pass plain controller mock into setupController()
, too.
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/