我已经倾注了大量的文档,我似乎无法找到一个非常基本的问题的答案。我有一个组件需要将地图(键/值)存储为属性:
App.SimpleTestComponent = Ember.Component.extend({
data: Ember.A(),
actions: {
add: function() {
this.get('data').set('test', 'value');
}
}
});
组件的模板如下所示:
<script type="text/x-handlebars" data-template-name="components/simple-test">
{{#each item in data}}
<p>
<strong>{{item.key}}:</strong>
{{ item.value}}
</p>
{{/each}}
<button {{action 'add'}}>Add</button>
</script>
然而,这不起作用。 No items are displayed after clicking the button问题似乎与{{#each}}
阻止有关。如何正确枚举data
属性?
答案 0 :(得分:3)
Ember.A()
是Ember.NativeArray的简写。这就是你的原因
代码不起作用,您还调用.set
这是一种方法
继承自Ember.Observable
。所以你真正在做的是
只是在数组上设置一个对象属性而不是它
内容。
您可能想要的是Ember.Map
这是一个内部类
但许多开发人员仍然使用它。你仍然需要返回一个
对象数组如下例所示:
App.SimpleTestComponent = Ember.Component.extend({
// Shared map among all SimpleTestComponents
map: Ember.Map.create(),
// Or per component map
init: function() {
this.set('map', Ember.Map.create());
},
data: function() {
// this doesn't have to be locally scoped...
var arr = Ember.A();
this.get('map').forEach(function(key, value) {
arr.addObject({key: key, value: value});
});
return arr;
}.property('map'),
actions: {
add: function() {
this.get('map').set('test', 'value');
}
}
});
当你的密钥有倍数时,这并不能真正起作用
值只是因为Ember.Map
总是覆盖.set