对EmberJS物体的反思?如何在不事先知道密钥的情况下查找属性键列表

Seb*_*rre 23 ember.js

如果您事先不知道所有密钥,有没有办法检索EmberJS对象的set-at-creations属性?

通过检查器,我看到所有对象属性看起来都存储在元对象的values哈希中,但我似乎无法找到任何方法来获取它.例如,object.getProperties()需要一个键列表,但我正在尝试创建一个通用对象容器,它不会提前知道它将包含什么,但能够返回有关自身的信息.

Luk*_*lia 25

我没有在生产代码中使用它,因此您的里程可能会有所不同,但查看Ember源代码可能会对您有用,或者至少值得查看实现:

Ember.keys:"返回在对象或散列上定义的所有键.这在检查对象以进行调试时非常有用.在支持它的浏览器上,它使用本机Object.keys实现." MDN上的Object.keys文档

Ember.inspect:"检查对象的便捷方法.此方法将尝试将对象转换为有用的字符串描述." Github上的消息来源


Mar*_*ten 5

我相信简单的答案是:你找不到道具清单.至少我没能做到.

但是我注意到ember道具似乎是前缀__ember,这让我解决了这个问题:

for (f in App.model) { 
    if (App.model.hasOwnProperty(f) && f.indexOf('__ember') < 0) { 
       console.log(f);
    }
 };
Run Code Online (Sandbox Code Playgroud)

它似乎工作.但我不知道是否100%肯定不会得到任何不好的道具.

编辑:亚当的要点来自评论.https://gist.github.com/1817543

var getOwnProperties = function(model){
  var props = {};
  for(var prop in model){
    if( model.hasOwnProperty(prop) 
        && prop.indexOf('__ember') < 0
        && prop.indexOf('_super') < 0
        && Ember.typeOf(model.get(prop)) !== 'function'
    ){
      props[prop] = model[prop];
    }
  }
  return props;
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,使用hasOwnProperty拒绝属性只会使我们在create()方法中定义属性.这意味着我们在模型中声明的任何默认属性都不会被返回.删除它会给我们留下额外的属性,例如我们不想要的'isInstance'.可以在[这里](http://jsfiddle.net/adjohu/rZkQj/)查看更新的示例.我稍微改了一下,使用getProperties来检索属性.就我的目的而言,isInstance不是问题所以如果你需要,我会让你进一步改进它. (3认同)

wma*_*but 5

遗憾的是,这些答案都不可靠,因为任何与a nullundefined值配对的键都不可见.

例如

MyClass = Ember.Object.extend({
    name: null,
    age: null,
    weight: null,
    height: null
});
test = MyClass.create({name: 'wmarbut'});
console.log( Ember.keys(test) );
Run Code Online (Sandbox Code Playgroud)

只会给你

["_super", "name"]
Run Code Online (Sandbox Code Playgroud)

我想出的解决方案是:

/**
* Method to get keys out of an object into an array
* @param object obj_proto The dumb javascript object to extract keys from
* @return array an array of keys
*/
function key_array(obj_proto) {
    keys = [];
    for (var key in obj_proto) {
        keys.push(key);
    }
    return keys;
}


/*
* Put the structure of the object that you want into a dumb JavaScript object
* instead of directly into an Ember.Object
*/
MyClassPrototype = {
    name: null,
    age: null,
    weight: null,
    height: null
}

/*
* Extend the Ember.Object using your dumb javascript object
*/
MyClass = Ember.Object.extend(MyClassPrototype);

/*
* Set a hidden field for the keys the object possesses
*/
MyClass.reopen({__keys: key_array(MyClassPrototype)});
Run Code Online (Sandbox Code Playgroud)

使用此方法,您现在可以访问该__keys字段并知道要迭代的键.然而,这不能解决事先不知道结构的物体的问题.


Phe*_*nix 5

我用这个:

Ember.keys(Ember.meta(App.YOUR_MODEL.proto()).descs)
Run Code Online (Sandbox Code Playgroud)