2013-02-26 14 views
9

Jaka jest różnica między .create() i .createWithMixins()? Nie mogę znaleźć żadnej dokumentacji na ten temat. Podczas tworzenia instancji widoku za pomocą .create() i nazywają this._super() w metodzie didInsertElement następnie, po zostanie zgłoszony błąd:Różnica między .create() i .createWithMixins() w ember

Ember.Object.create nie obsługuje już zdefiniowanie metod, które wywołują _super.

Ale po zastąpieniu .create() z .createWithMixins() wszystko działa poprawnie. Oto kod i próbka js:

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

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

Odpowiedz

22

Od Wikipedia:

W językach programowania obiektowego, wstawką to klasa, która zawiera kombinację metod z innych klas. Sposób wykonania takiej kombinacji zależy od języka, ale nie jest dziedziczony. Jeśli kombinacja zawiera wszystkie metody łączonych klas, jest to równoważne dziedziczeniu wielokrotnemu.

W przypadkach Ember obiektów są tworzone metodą create bez argumentów, albo z jednym mieszania (KVO) reprezentujących właściwości tego typu i jest automatycznie wypełniana. Przykład:

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' 
}) 

Z drugiej strony, crateWithMixins, pozwalają na mieszanki inną definicję klasy w jednej instancji obiektu lub do innej klasy. Załóżmy, że masz powyższe powyższe dane, ale nie chcesz podklasować go za pomocą extend i utworzyć innego typu. W takim przypadku można użyć wartości Mixin, aby upewnić się, że tylko jedna instancja będzie miała taką definicję dwóch klas. Przykład:

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' 
}); 

Jednakże, jeśli chcesz utworzyć nową klasę z Mixin, można extendEm.Object, przekazując Mixin jako pierwszy argument, a mianowicie:

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

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

Zapoznaj się z API Documentation a także ten JSFiddle.

Edit: Jak dla _super(), należy użyć tego tylko podczas tworzenia nowej klasy (przez extend). W przypadku wystąpienia istniejących klas nie powinieneś dzwonić pod numer _super().

Kolejna sprawa. Widzę, że próbujesz bezpośrednio uzyskać create a View. Sądzę, że w oparciu o twój kod, powinieneś rozszerzyć Ember.View i pozwolić, aby framework tworzył instancję dla ciebie w odpowiednim czasie. Jeśli utworzysz ręcznie, będziesz odpowiedzialny za niektóre części swojego przepływu pracy, takie jak dołączenie go do DOM, usunięcie go itp.Może nie widzę cały obraz, ale na podstawie tego samego kodu, myślę, że należy nie połączenia create tam i zamiast zadzwonić extend, a wtedy będziesz mógł zadzwonić _super()

+0

@Joe, wielkie dzięki dużo za to szczegółowe wyjaśnienie. To było naprawdę bardzo pomocne dla mnie. Jeśli nie powinniśmy używać .super() podczas tworzenia instancji, to dlaczego ember nie generuje żadnego błędu, jeśli używam jego minified wersji? – phkavitha

+0

Nie jestem pewien, ale być może wersja ze skróconą wersją usuwa kilka twierdzeń. Zwykle wersja debugowania/programowania ma wszystkie twierdzenia, które pomogą ci zidentyfikować potencjalne problemy, podczas gdy minified jest do użytku produkcyjnego, więc zakłada się, że skończyłeś testowanie. – MilkyWayJoe

Powiązane problemy