2013-03-27 17 views
8

Ich arbeite mit Formularen in Ember.js und möchte eine Liste aller Modelleigenschaften abrufen, damit ich zu unterschiedlichen Zeitpunkten Momentaufnahmen vom Status des Formulars machen kann . Gibt es eine Möglichkeit, eine Liste aller Eigenschaften eines Modells zu erhalten?So rufen Sie alle Eigenschaften eines Ember.js-Modells ab

Zum Beispiel, wenn mein Modell ist:

App.User = DS.Model.extend({ 
    name: DS.attr('string'), 
    email: DS.attr('string'), 
    current_password: DS.attr('string'), 
    password: DS.attr('string'), 
    password_confirmation: DS.attr('string'), 
    admin: DS.attr('boolean'), 
} 

Dann würde ich so etwas haben mag:

> getEmberProps('User') 

["name", "email", "current_password", "password", "password_confirmation", "admin"] 
+0

JSON.Stringify? Hast du das probiert? – marko

+0

hmmm, ich würde nicht wissen, wie man JSON.stringify das zu einem Ember-Modell – joscas

Antwort

13

Sie können einfach toJSON Methode auf Modell verwenden und die Schlüssel von Objekt abrufen.

Ember.keys(model.toJSON())

Beachten Sie, dass Sie keine Schlüssel für die Beziehungen zurückkehren wird.

+4

'Beachten Sie, dass Sie keine Schlüssel für Relationen zurückgeben können. -> Ich weiß nicht, welche Version des Embers Sie verwenden. Ich benutze zur Zeit Ember 1.11.3, für diese Version werden auch Relationstasten zurückgegeben. –

0

Es gibt keine einfache Möglichkeit, aber man konnte eine benutzerdefinierte mixin versuchen, wie dies:

Ember.AllKeysMixin = Ember.Mixin.create({ 
    getKeys: function() { 
     var v, ret = []; 
     for (var key in this) { 
      if (this.hasOwnProperty(key)) { 
       v = this[key]; 
       if (v === 'toString') { 
        continue; 
       } // ignore useless items 
       if (Ember.typeOf(v) === 'function') { 
        continue; 
       } 
       ret.push(key); 
      } 
     } 
     return ret 
    } 
}); 

Sie können es wie folgt verwenden:

App.YourObject = Ember.Object.extend(Ember.AllKeysMixin, { 
... //your stuff 
}); 
var yourObject = App.YourObject.create({ 
    foo : "fooValue"; 
}); 
var keys = yourObject.getKeys(); // should be ["foo"]; 
+0

Dank @mavilein Was ich nicht von dieser Lösung mag, muss ein Mixin verwenden. Ich bin selbst auf etwas gestoßen, das zu funktionieren scheint (siehe meine Bearbeitung). Könnte Ihre Lösung funktionieren, ohne dass Sie von einem Mixin ausgehen müssen? – joscas

+0

Wenn Sie nicht in der Mixin mögen, sollte es einfach sein, den Code in eine separate Funktion mit dem Modell als Argument zu extrahieren. Aber ich verstehe nicht, warum du das Mixin nicht magst. Dies ist wahrscheinlich der beste Weg, um dieses Problem zu lösen. – mavilein

+0

Nun, vielleicht bin ich verwirrt, aber wenn ich das Mixin auf diese Weise benutze, bekomme ich die Eigenschaften der Objektinstanz, aber das kann ich nicht: 'User = DS.Model.extend (Ember.AllKeysMixin, { Name: DS.attr ('string'), email: DS.attr ('string'), aktuelles_passwort: DS.attr ('string'), passwort: DS.attr ('string'), password_confirmation: DS.attr ('string'), admin: DS.attr ('boolean'), 'und dann' model.getKeys() 'irgendwo anders, um 'name', 'email', etc .. – joscas

4

Eine einfache Möglichkeit, die Felder und ihre Werte zu drucken:
zu http://emberjs.com/api/data/classes/DS.Model.html#property_attributes http://emberjs.com/api/data/classes/DS.Model.html#method_eachAttribute

Ember.get(App.User, 'attributes').map(function(name) { return name; }); 
Ember.get(userInstance.constructor, 'attributes').map(function(name) { return name; }); 

Es gibt auch ähnliche Eigenschaften für Beziehungen:

Ember.keys(model.toJSON()).forEach(function(prop) { console.log(prop + " " + model.get(prop)); }) 
4

Sie können dies auch nutzen.

Verwandte Themen