【问题标题】:How to retrieve all properties of an Ember.js model如何检索 Ember.js 模型的所有属性
【发布时间】:2013-03-27 12:09:02
【问题描述】:

我正在使用 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"]

【问题讨论】:

  • JSON.stringify?你试过吗?
  • 嗯,我不知道如何 JSON.stringify 到 Ember 模型

标签: javascript ember.js


【解决方案1】:

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

Ember.keys(model.toJSON())

请注意,这不会返回您的关系键。

【讨论】:

  • Note that will not return you keys for relations -> 不知道你用的是哪个ember版本;我目前使用的是 Ember 1.11.3,因为该版本的关系键也会返回。
【解决方案2】:

你也可以使用这个:
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; });

关系也有类似的属性。

【讨论】:

    【解决方案3】:

    打印字段及其值的简单方法:

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

    【讨论】:

      【解决方案4】:

      没有简单的方法,但您可以尝试这样的自定义 mixin:

      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"];
      

      【讨论】:

      • 谢谢@mavilein 我不喜欢这个解决方案是必须使用 mixin。我自己想出了一些似乎可行的方法(请参阅我的编辑)。您的解决方案是否可以在无需从 mixin 扩展的情况下工作?
      • 如果您不喜欢mixin,应该很容易将代码提取到以模型为参数的单独函数中。但我不明白,为什么你不喜欢 mixin。这可能是解决这个问题的最简单的方法。
      • 好吧,也许我很困惑,但如果我以这种方式使用 mixin,我得到的是对象实例的属性,但我不能这样做:User = DS.Model.extend(Ember.AllKeysMixin,{ 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'), 然后@ 987654324@somewhere else to get 'name', 'email', etc..
      • 啊,我不明白你的问题。所以你想获取类的属性而不是实例的属性。当我阅读模型时,我总是在考虑实例。所以我的方法行不通。也许可以通过reopenClass() 将这个函数相对容易地迁移到类中。
      • 也许我的问题的标题具有误导性。如果有人能想到更好的标题,我会很乐意编辑。
      【解决方案5】:

      2018 年:使用 Ember Data 的eachAttribute

      所以,给定一个模型 Foo:

      import Model from 'ember-data/model';
      import attr from 'ember-data/attr';
      
      export default Model.extend({
          "name": attr('string'),
          "status": attr('string')
      });
      

      让我们通过构造函数获取模型的定义:

      var record = this.store.createRecord('foo', {
          name: "model1",
          status: "status1"
      });
      this.modelClass = record.constructor;
      

      并为其每个 Ember Data 属性调用一个函数:

      modelClass.eachAttribute(function(key, meta){ 
         //meta provides useful information about the attribute type
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-20
        • 1970-01-01
        • 2013-10-20
        • 1970-01-01
        相关资源
        最近更新 更多