我有Ember.Object,它被用作基本键/值字典。键的名称是动态的,我希望能够做的是迭代这些属性。看起来这应该很容易,但谷歌搜索和我的集体头部抓挠似乎并没有指向我期待的明显答案。
对于以下伪代码:
App.MyObject = Ember.Object.extend({
randomComputedProperty: function() {
return "foobar";
}
}
$object = new MyObject.create(someBigAndUnpredictableNameValueHash);
我理想的解决方案可以解决这个代码,让我能够快速辨别:
object
具有object
具有无论如何都有任何想法?
-----更新-----
对我的确切用例更加明确一点。虚构的MyObject
实际上是一个来自我的模型的属性:
App.MyModel = DS.Model.extend({
prop1: DS.attr('string'),
prop2: DS.attr('number'),
prop3: DS.attr('my-object')
}
设置Transform对象以处理序列化/反序列化:
App.MyObjectTransform = DS.Trnasform.extend({
deserialize: function(serialized) {
return App.MyObject.create(serialized)
},
deserialize: function(deserialized) {
return deserialized;
}
}
这样,当我在把手模板中使用MyModel
时,我可以执行以下操作:
{{prop1}}
{{prop2}}
{{#each prop3}}
{{key}} = {{value}}
{{/each}}
答案 0 :(得分:17)
在Ember v2.0.0-beta.1 you can use {{each-in}}
帮助程序中,您可以在模板中迭代对象键及其值。
例如,示例对象:
App.MyObject = Ember.Object.extend({
randomComputedProperty() {
return 'foobar';
}
});
以这种方式实例化:
let $object = App.MyObject.create({
prop1: 'value1',
prop2: 'value2',
prop3: ['element1', 'element2']
});
使用{{each-in}}
帮助程序在模板中迭代:
{{#each-in $object as |key value|}}
`{{key}}`:`{{value}}`
{{/each-in}}
产生以下结果:
`prop1`:`value1`
`prop2`:`value2`
`prop3`:`element1,element2`
值得一提的是使用{{each-in}}
帮助器:
是对象的一次性快照,它不会被观察到 添加/删除/更改属性。
感谢@ Kingpin2k指出这一点。 Demo,请注意,prop1
的更新未反映在DOM中。
答案 1 :(得分:8)
以下是一些想法。
对象的键方法1
您可以迭代属性并从原型链中过滤掉键(使用the hasOwnProperty()
method):
var obj = App.MyObject.create({stuff: "stuff!"});
var objKeys = []
for(var key in obj) {
if(obj.hasOwnProperty(key)){
objKeys.push(key);
}
}
console.log(objKeys); // ['stuff']
对象的键方法2
在较新的浏览器上,您可以使用the Object.keys()
method直接获取对象属性的数组:
console.log(Object.keys(obj)); // ['stuff']
Ember.Object的计算属性
Ember提供了一种使用eachComputedProperty()
method
App.MyObject.eachComputedProperty(function(name, meta){
console.log(name, meta); // randomComputedProperty
});
JSBin example demonstrating these methods
<强>更新强>
你可以在模型上有一个计算属性,将MyObject
的数据重新排列成一个数组,然后由把手显示:
App.MyModel = DS.Model.extend({
prop1: DS.attr('string'),
prop2: DS.attr('number'),
prop3: DS.attr('my-object'),
prop3PropertyArray: function(){
var prop3,
propertyArray = [];
prop3 = this.get('prop3');
for(var key in prop3) {
if(prop3.hasOwnProperty(key) && key !== "toString"){
propertyArray.push({key: key, value: prop3.get(key)});
}
}
return propertyArray;
}.property('prop3')
});
如果包含prop3
:
prop3: App.MyObject.create({
stuff: "stuff!",
anotherRandomKey: "more value here"
})
然后prop3PropertyArray
将是:
[
{
key: "stuff",
value: "stuff!"
},
{
key: "anotherRandomKey",
value: "more value here"
}
]
然后可以使用{{#each}}..{{/each}}
帮助器在车把中显示:
{{#each item in prop3PropertyArray}}
{{item.key}} = {{item.value}}<br>
{{/each}}