2013-03-27 38 views
8

我正在使用Ember.js中的表单,我想检索所有模型属性的列表,以便我可以在不同时刻拍摄表单状态的快照。有没有办法获得模型的所有属性列表?如何检索Ember.js模型的所有属性

例如,如果我的模型是:

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

然后,我想有这样的事情:

> getEmberProps('User') 

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

JSON.stringify?你尝试过吗? – marko 2013-03-27 12:22:58

+0

嗯,我不会知道如何JSON.stringify到Ember模型 – joscas 2013-03-27 12:46:34

回答

13

您可以简单地在模型上使用toJSON方法并从对象中获取密钥。

Ember.keys(model.toJSON())

注意,将不会返回你的关系键。

+4

'请注意,不会返回您关键字的密钥' - >我不知道您使用的是哪个烬心版本;此刻我正在使用Ember 1.11.3,因为该版本的关系键也会返回。 – 2015-04-17 11:43:38

0

有没有简单的方法,但你可以尝试使用自定义的混入这样的:

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

您可以使用它像这样:

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

感谢@mavilein我不喜欢这种解决方案是不得不使用混合。我已经提出了一些似乎可行的事情(请参阅我的编辑)。您的解决方案可以在不需要从mixin扩展的情况下工作吗? – joscas 2013-03-27 12:57:17

+0

如果你不喜欢mixin,应该很容易将代码提取到一个单独的函数中,以模型作为参数。但我不明白,为什么你不喜欢mixin。这可能是解决这个问题的最简单的方法。 – mavilein 2013-03-27 13:04:38

+0

好吧,也许我很困惑,但如果我以这种方式使用mixin,我得到的是对象实例的属性,但我不能这样做:'User = DS.Model.extend(Ember.AllKeysMixin, {'name':DS.attr('string'), email: password_confirmation:DS.attr('string'), admin:DS.attr('boolean'),'然后'model.getKeys()'在别的地方得到'name','email'等。 – joscas 2013-03-27 13:15:01

4

一个简单的方法来打印出的字段和值:您也可以使用此

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