2013-02-21 7 views
11

non riuscivo a trovare un modo per realizzare il compito di tale conversione come non ho potuto trovare alcun mezzo di recupero delle proprietà Ember.js per l'oggetto. Ember.keys restituisce solo le proprietà ho impostato in create o con get e le proprietà dichiarate in Ember.extend non mostrano lassù. Io uso tali proprietà per impostare i valori di default (ad esempio [] oggetti array)C'è un modo per convertire l'Oggetto Ember in un semplice oggetto javascript?

+0

Sembra che JSON.stringify ignori anche le "proprietà di classe" – Qrilka

risposta

0

Al momento ho risolto con il seguente frammento:

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

Non va la gerarchia delle classi e non sembra in mixins (come io uso per gli oggetti di dati che sono sotto forma abbastanza semplice che punto di vista)

3

vorrei fare qualcosa di simile alla persona di cui sopra, ma mi piacerebbe farlo un po 'diverso.

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

oggetto

Poi basta necessità di attuare il App.NativeObject mixin in oggetti che si desidera che il toNative on:

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

Abbiamo poi avere lo toNative metodo su tutti gli oggetti che implementano il nostro mixin.

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

+0

la soluzione non è ricorsiva sebbene – Qrilka

+0

È comunque un piccolo passo da ciò a renderlo ricorsivo. – Wildhoney

+0

sì, ma dare un'occhiata a questa forcella del vostro violino - http://jsfiddle.net/C2Rdn/: se si crea una classe, "NativeObject" includerà le proprietà extra, come 'isDestroyed' ecc – Qrilka

-1

Un'altra possibile soluzione che possa soddisfare le vostre esigenze, pur non essendo completamente ricorsiva per gli oggetti nidificati Ember:

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

Ciò includerà solo le proprietà reali che hai definito e non Braci interni. Di nuovo, lo svantaggio qui è che tutti gli oggetti Ember nidificati non saranno convertiti, ma appariranno come stringhe in stile "".

25

Qui è la mia soluzione sporca

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

nota: questo non include le funzioni – Jaime

+0

Al giorno d'oggi si potrebbe semplicemente usare 'model.toJSON()'. –

0

Questo è quello che ho fatto e funziona abbastanza bene. Si noti, questo dovrebbe essere pronto solo, le eventuali modifiche apportate a un oggetto o un array in oggetto copiato influenzerà l'oggetto originale

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

qualcosa di molto semplice che ha funzionato abbastanza correttamente per me è:

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

al momento del caricamento dell'app.

Problemi correlati