2013-02-21 4 views
11

Ich konnte keine Möglichkeit finden, die Aufgabe einer solchen Konvertierung zu erledigen, da ich keine Möglichkeit fand, Ember.js-Eigenschaften für das Objekt zu erhalten. Ember.keys gibt nur die Eigenschaften zurück, die ich in create oder mit get festgelegt habe, und die in Ember.extend deklarierten Eigenschaften werden dort nicht angezeigt. Ich benutze solche Eigenschaften Standardwerte (zB [] für Array-Eigenschaften)Gibt es eine Möglichkeit, Ember-Objekt in ein einfaches JavaScript-Objekt zu konvertieren?

+0

Es sieht aus wie JSON.stringify ignoriert auch "Klasseneigenschaften" – Qrilka

Antwort

0

Im Moment einzurichten ich es mit dem folgenden Ausschnitt lösen:

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

Es ist nicht die Klassenhierarchie geht und sieht nicht so aus in Mixins (wie ich für Datenobjekte verwenden, die aus dieser Sicht recht einfach sind)

3

Ich würde etwas ähnliches wie die Person oben tun, aber ich würde es ein bisschen anders machen.

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

Objekt

Dann brauchen Sie nur die App.NativeObject mixin in Ihre Objekte zu implementieren, die Ihnen toNative auf möchten:

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

Wir haben dann habe die toNative Methode für alle Objekte, die unser Mixin implementieren.

Obligatorische jsFiddle: http://jsfiddle.net/jumUx/

+0

Ihre Lösung ist nicht rekursiv obwohl – Qrilka

+0

Es ist ein kleiner Schritt von diesem zu machen es rekursiv, jedoch. – Wildhoney

+0

yep, aber sieh dir diese Gabel deiner Geige an - http://jsfiddle.net/C2Rdn/: Wenn du eine Klasse erstellst, wird "NativeObject" zusätzliche Eigenschaften wie 'isDestroyed' usw. enthalten. – Qrilka

-1

Eine andere mögliche Lösung, die Ihren Anforderungen entsprechen können, während nicht für verschachtelte Ember Objekte vollständig rekursiv zu sein:

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

Dies wird nur die tatsächlichen Eigenschaften enthalten, die Sie definiert haben und keine Gluteinbauten. Auch hier besteht der Nachteil darin, dass alle verschachtelten Ember-Objekte selbst nicht konvertiert werden, sondern als Strings im Stil von "" erscheinen.

25

Hier ist meine schmutzige Abhilfe

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

Hinweis: Dies beinhaltet keine Funktionen – Jaime

+0

Heutzutage könnte man einfach 'model.toJSON()' verwenden. –

0

Das ist, was ich tat und es funktioniert ganz gut. Beachten Sie, dass dies nur bereit sein sollte, da alle Änderungen an einem Objekt oder Array in dem kopierten Objekt wird das ursprüngliche Objekt

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

etwas ganz einfach beeinflussen, die für mich richtig genug gearbeitet ist:

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

zur Ladezeit der App.

Verwandte Themen