且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间: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/