2013-02-21 13 views
11

Nie mogłem znaleźć żadnego sposobu na wykonanie zadania takiej konwersji, ponieważ nie mogłem znaleźć żadnego sposobu na uzyskanie właściwości Ember.js dla obiektu. Ember.keys zwraca tylko właściwości ustawione w create lub get, a właściwości zadeklarowane w Ember.extend nie są tam wyświetlane. Używam takich właściwości, aby skonfigurować wartości domyślne (np [] dla właściwości tablicy)Czy istnieje sposób przekonwertowania obiektu Ember do zwykłego obiektu javascript?

+0

Wygląda na to, że JSON.stringify ignoruje również "właściwości klasy" – Qrilka

Odpowiedz

0

W tej chwili mogę go rozwiązać z następującym fragmencie:

App.plainCopy = function (obj) { 
    if (Ember.isArray(obj)) { 
    return obj.map(App.plainCopy); 
    } else if (typeof(obj) === "object") { 
    if (App.Plainable.detect(obj)) { 
     return obj.plainCopy(); 
    } else { 
     throw new Error(Ember.String.fmt("%@ is not Plainable", [obj])); 
    } 
    } else { 
    return obj; 
    } 
} 

App.Plainable = Ember.Mixin.create({ 
    plainCopy: function() { 
    var props = Ember.keys(this); 
    var proto = this.constructor.prototype; 
    for(p in proto) { 
     if (proto.hasOwnProperty(p) && typeof(this[p])!=="function") { 
     props.push(p); 
     } 
    } 
    var copy = {}; 
    props.forEach(function(p) { 
     copy[p] = App.plainCopy(this.get(p)); 
    }, this); 
    return copy; 
    } 
}); 

nie idzie w górę hierarchii klasowej i nie wygląda na mixiny (jak używam dla obiektów danych, które są dość proste z tego punktu widzenia)

3

Zrobiłbym coś podobnego do osoby powyżej, ale zrobiłbym to trochę inaczej.

Mixin

App.NativeObject = Ember.Mixin.create({ 
    toNative: function() { 
     var properties = []; 
     for (var key in this) { 
      if (jQuery.inArray(Ember.typeOf(object[key]), ['string', 'number', 'boolean']) !== -1) { 
       properties.push(key); 
      } 
     } 
     return this.getProperties(properties); 
    } 
}); 

Object

Potem wystarczy wdrożyć App.NativeObject wstawek w swoich obiektach, które lubisz toNative na:

var Object = Ember.Object.extend(App.NativeObject, { 
    name: 'Adam', 
    count: 4 
}); 

Następnie mieć toNative metoda na wszystkich obiektach, które implementują nasz mixin.

obowiązkowe jsFiddle: http://jsfiddle.net/jumUx/

+0

, ale twoje rozwiązanie nie jest rekursywne. – Qrilka

+0

Jest to jednak mały krok do tego, aby uczynić go rekursywnym. – Wildhoney

+0

Tak, ale spójrz na ten widelec swojego skrzypka - http://jsfiddle.net/C2Rdn/: jeśli utworzysz klasę, "NativeObject" będzie zawierał dodatkowe właściwości, takie jak 'isDestroyed' itp. – Qrilka

-1

Innym możliwym rozwiązaniem, które może w zależności od potrzeb, podczas gdy nie jest w pełni rekurencyjne dla obiektów zagnieżdżonych Ember:

// where myEmberObject is.. an ember object 
var plainJavaScriptObject = myEmberObject.toJSON(); 

będzie to obejmować tylko rzeczywiste właściwości, które zostały zdefiniowane i nie Wewnętrzne embery. Ponownie, wadą jest to, że wszystkie zagnieżdżone obiekty Embera same nie będą konwertowane, ale pojawią się jako łańcuchy w stylu "".

25

Oto mój brudny obejście

var newModel = JSON.parse(JSON.stringify(model)); 
+0

uwaga: nie obejmuje to funkcji – Jaime

+0

W dzisiejszych czasach wystarczy użyć 'model.toJSON()'. –

0

To, co zrobiłem i działa całkiem dobrze. Uwaga, to powinno być tylko gotowe, a wszelkie zmiany przedmiotu lub tablicy w kopiowanego obiektu wpłynie oryginalnego obiektu

App.BaseValidations = Ember.Object.create({ 
    toObject: function() { 
     var destination = {} 
     for (var k in this) { 
      if (this.hasOwnProperty(k) && typeof(this[k]) !== 'function') { 
       destination[k] = this[k]; 
      } 
     } 
     return destination; 
    } 
}) 
0

coś całkiem proste, że pracował na tyle właściwie dla mnie jest:

Ember.Object.reopen({ 
    toJson: function() { 
     return JSON.parse(JSON.stringify(this)); 
    } 
}); 

w czasie ładowania aplikacji.

Powiązane problemy