2013-02-26 3 views
9

Was ist der Unterschied zwischen .create() und .createWithMixins()? Ich kann dazu keine Unterlagen finden. Wenn ich eine Ansicht Instanz mit .create() und rufen in der this._super()didInsertElement Verfahren erstellen dann wird folgende Fehlermeldung ausgegeben:Unterschied zwischen .create() und .createWithMixins() in ember

Ember.Object.create nicht länger unterstützt Methoden definieren, die _super nennen.

Aber wenn ich .create() durch .createWithMixins() ersetze, funktioniert alles gut. Hier ist der Code und die Probe js Geige:

App.SampleView = Ember.View.create({ 
    sampleProperty : "a", 
    didInsertElement : function(){ 
     this._super(); 
     this.set("sampleProperty", "b");   
    } 
}); 

http://jsfiddle.net/bErRT/3/.

Antwort

22

Von Wikipedia:

In der objektorientierten Programmiersprachen, ist ein mixin eine Klasse, die eine Kombination von Methoden aus anderen Klassen enthält. Wie eine solche Kombination durchgeführt wird, hängt von der Sprache ab, aber nicht von der Vererbung. Wenn eine Kombination alle Methoden kombinierter Klassen enthält, entspricht dies der Mehrfachvererbung.

In Ember Instanzen von Objekten mit der create Methode ohne Argumente, oder mit einem einzigen Hash (KVO), die die Eigenschaften dieses Typs repräsentiert erstellt, und sie werden automatisch gefüllt werden. Beispiel:

var SomeClass = Ember.Object.extend({ 
    name: '', 
    url: '' 
}); 

// this instance will have a "name" and a "url" properties with blank values 
var someInstance = SomeClass.create(); 

// this instance will have the same properties, but now 
// their values will be populated 
var anotherInstance = SomeClass.create({ 
    name: 'Ember.js', 
    url: 'http://emberjs.com' 
}) 

Auf der anderen Seite, crateWithMixins, können Sie Mix ein andere Klassendefinition in eine einzige Objektinstanz oder in einer anderen Klasse. Nehmen wir an, Sie haben das gleiche SomeClass oben, aber Sie wollen es nicht über extend unterteilen und einen anderen Typ erstellen. In diesem Fall können Sie eine Mixin verwenden, um sicherzustellen, dass nur diese eine Instanz diese Definition der beiden Klassen hat. Beispiel:

var SomeClass = Ember.Object.extend({ 
    name: '', 
    url: '' 
}); 

// note that you don't extend a mixin, you only create 
var SomeOtherClass = Ember.Mixin.create({ 
    doSomething: function() { 
     console.log('doing my thing'); 
    } 
}); 

// This instance will have a method called "doSomething" 
var x = SomeClass.createWithMixins(SomeOtherClass, { 
    name: 'Ember.js', 
    url: 'http://emberjs.com' 
}); 

// this instance only has methods/properties defined in "SomeClass" 
// therefore, no method called "doSomething" 
var y = SomeClass.create({ 
    name: 'Google', 
    url: 'http://google.ca' 
}); 

Wenn Sie jedoch eine neue Klasse mit einem Mixin erstellen möchten, können Sie extendEm.Object, die Mixin als erstes Argument übergeben, wie folgt:

var AnotherClass = Ember.Object.extend(SomeOtherClass, { 
    firstName: '', 
    lastName: '' 
}); 

var z = AnotherClass.create(); 
z.set('firstName', 'Hiro'); 
z.set('lastName', 'Nakamura'); 
z.doSomething(); 

Schauen Sie sich die API Documentation sowie diese JSFiddle.

bearbeiten: Was _super(), können Sie dies nur, wenn Sie eine neue Klasse erstellen (via extend). Wenn Sie create Instanzen vorhandener Klassen verwenden, sollten Sie nicht _super() aufrufen.

Eine andere Sache. Ich sehe, Sie versuchen, create a View direkt. Ich glaube, basierend auf Ihrem Code sollten Sie Ember.View erweitern und das Framework erstellen Instanz für Ihre zur richtigen Zeit. Wenn Sie manuell erstellen, sind Sie für einige Teile des Workflows verantwortlich, z. B. indem Sie sie an das DOM anhängen, entfernen usw.Vielleicht sehe ich nicht das ganze Bild, sondern auf der Grundlage dieser Code allein, ich glaube, Sie sollten nicht Anruf create gibt und stattdessen extend rufen, und dann werden Sie _super()

+0

@ Joe, Dank nennen können, viel für diese ausführliche Erklärung. Es war in der Tat sehr hilfreich für mich. Wenn wir während der Erstellung der Instanz nicht .super() verwenden sollen, warum wirft ember dann keinen Fehler, wenn ich die minimierte Version verwende? – phkavitha

+0

Ich bin mir nicht sicher, aber vielleicht die verkürzte Version streift einige Behauptungen aus. In der Regel enthält die Debug/Development-Version alle Assertions, die Ihnen dabei helfen, potenzielle Probleme zu identifizieren, während die Minimierung für die Produktion verwendet wird. Daher wird davon ausgegangen, dass Sie mit dem Testen fertig sind. – MilkyWayJoe

Verwandte Themen