2016-11-15 2 views

Antwort

14

Welcome to Ember ;-)

jedes Objekt, das Ember Observable mixin erstreckt unterstützt die get() Methode (unter anderem).

Wenn Sie this.get() aufrufen, müssen die this auf ein solches Objekt beziehen (Route, Controller, Component, Ihre eigene Klasse, die Ember.Object und so weiter erstreckt). Der Aufruf von get() für ein einfaches Objekt würde einen Fehler verursachen. Lassen Sie mich den Unterschied zeigen:

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 

jedoch mit Ember.get() Erfolge in beiden Fällen:

Ember.get(emberObjectInstance, 'name'); // returns 'Bala' 
Ember.get(plainObject, 'name');   // returns 'Bala', too 

Hinweis: get berechnet (in den häufigsten Fällen nicht zu vergessen, ruft entweder von get() berechneten Eigenschaft macht Ich möchte jetzt nicht tief tauchen - lazy computation, volatile extensions etc.), Aber um den Unterschied zu verstehen, können wir mit einfachen Werten arbeiten.

Aus eigener Erfahrung verwende ich Ember.get() überall, wo ich weiß, ein einfaches Objekt könnte das Objekt sein, dessen Eigenschaft ich abrufen muss. Ein schönes Beispiel ist setupController() Haken, in den ich glattes Objekt von meinen Einheitstests übergeben kann, um die Funktionalität von setupController() zu prüfen.

// 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"); 
... 

konnte ich auch Benutzer Ember.set(controller, 'isNamePresentOnSetup', Ember.isPresent(name)) und dann Mock Ebene Controller in setupController() passieren, auch.

Ich denke, das ist ein guter Anfang, da Sie neu in Ember sind und ich bin mir sicher, dass Ember-Gurus viel mehr hinzuzufügen hätten. Relevante 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/

+0

Danke für die Erklärung in Kürze. –

+0

Ich denke, es ist ein Fehler in der Erklärung. In "const modelMock = {name: 'Bala'}; // einfaches Objekt ist genug, weil ich Ember.set anstelle von model.set() verwende, siehst du?" Es ist eigentlich Ember.get() ryt? –

+0

Sie sind richtig, thx! – Pavol

2

Es gibt keine ist. foo.get('bar') entspricht Ember.get(foo, 'bar'). Da foo.get jedoch unter Ember.Object definiert ist, können Sie nur .get() auf Ember Objects aufrufen. Ember.get() funktioniert bei allen Glut-Objekten. Auf Glimmobjekt Ember.get(foo, 'bar') entspricht foo.get('bar'), auf jedem anderen Objekt entspricht es foo['bar'].

+0

Vielen Dank für Ihre Antwort :) –