2013-03-27 15 views
8

Pracuję z formularzami w Ember.js i chcę pobrać listę wszystkich właściwości modelu, aby móc wykonywać migawki stanu formularza w różnych momentach . Czy istnieje sposób, aby uzyskać listę wszystkich właściwości modelu?Jak odzyskać wszystkie właściwości modelu Ember.js

Na przykład, jeśli mój model jest:

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

Następnie chciałbym mieć coś takiego:

> getEmberProps('User') 

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

JSON.stringify? Czy próbowałeś tego? – marko

+0

hmmm, nie wiedziałbym, jak JSON.stringify to do modelu Ember – joscas

Odpowiedz

13

Można po prostu użyć metody toJSON na modelu i uzyskać klucze od obiektu.

Ember.keys(model.toJSON())

Zauważ, że nie wróci ci klucze do relacji.

+4

'Zauważ, że nie zwróci ci kluczy do relacji' -> Nie wiem, której wersji ember używasz; Używam Ember 1.11.3 w tej chwili, ponieważ te klucze relacji są również zwracane. –

0

Nie ma łatwy sposób, ale można spróbować niestandardową wstawek jak to:

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

można go używać tak:

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

Dzięki @mavilein To, co mi się nie podoba w tym rozwiązaniu, to użycie mixina. Sam wymyśliłem coś, co wydaje się działać (zobacz moją edycję). Czy Twoje rozwiązanie może działać bez konieczności przedłużania z mixin? – joscas

+0

Jeśli nie lubisz w mixin, powinno być łatwo wyodrębnić kod do oddzielnej funkcji z modelem jako argumentem. Ale nie rozumiem, dlaczego nie lubisz mixin. Jest to prawdopodobnie najbardziej żwawy sposób na rozwiązanie tego problemu. – mavilein

+0

Cóż, może jestem zdezorientowany, ale jeśli użyję tej metody w ten sposób, otrzymam właściwości instancji obiektu, ale nie mogę tego zrobić: 'User = DS.Model.extend (Ember.AllKeysMixin, { nazwa: DS.attr ('string'), email: DS.attr ('string'), current_password: DS.attr ('string'), hasło: DS.attr ('string'), password_confirmation: DS.attr ('string'), admin: DS.attr ('boolean'), 'a następnie' model.getKeys() 'gdzieś indziej, aby uzyskać 'name', 'email', itp. – joscas

4

łatwy sposób wydrukować pól i ich wartości:

Ember.keys(model.toJSON()).forEach(function(prop) { console.log(prop + " " + model.get(prop)); }) 
Powiązane problemy