如果您事先不知道所有密钥,有没有办法检索EmberJS对象的set-at-creations属性?
通过检查器,我看到所有对象属性看起来都存储在元对象的values哈希中,但我似乎无法找到任何方法来获取它.例如,object.getProperties()需要一个键列表,但我正在尝试创建一个通用对象容器,它不会提前知道它将包含什么,但能够返回有关自身的信息.
Luk*_*lia 25
我没有在生产代码中使用它,因此您的里程可能会有所不同,但查看Ember源代码可能会对您有用,或者至少值得查看实现:
Ember.keys:"返回在对象或散列上定义的所有键.这在检查对象以进行调试时非常有用.在支持它的浏览器上,它使用本机Object.keys实现." MDN上的Object.keys文档
Ember.inspect:"检查对象的便捷方法.此方法将尝试将对象转换为有用的字符串描述." Github上的消息来源
我相信简单的答案是:你找不到道具清单.至少我没能做到.
但是我注意到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)
遗憾的是,这些答案都不可靠,因为任何与a null或undefined值配对的键都不可见.
例如
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字段并知道要迭代的键.然而,这不能解决事先不知道结构的物体的问题.