我有以下课程:
App.Entity = Ember.Object.extend({
id: null,
name : null,
});
我有以下控制器:
App.HomeController = Ember.ObjectController.extend({
entities: null,
init:function(){
var myArray = [];
var a = App.Entity.create();
a.set('id',1);
a.set('name','A');
var b = App.Entity.create();
b.set('id'2);
b.set('name','B');
//and I add another entities dynamycally
myArray.push(a);
myArray.push(b);
console.log( 'isArray: '+ Ember.isArray(myArray) ); //I get true
this.set('entities', myArray );
}
});
问题是当我尝试迭代并在视图上呈现内容时:
<script type="text/x-handlebars" data-template-name="home" >
{{#if entities}}
{{#each entities }}
{{this.value}}
{{/each}}
{{/if}}
{{outlet}}
</script>
我得到以下错误:
Assertion Failed: The value that #each loops over must be an Array. You passed <App.Entity:ember425>,<App.Entity:ember426>,...
如何解决?
答案 0 :(得分:1)
在阅读了他们的文档后,我了解到你应该使用Ember.ArrayController
来渲染数组。
来自their documentation的示例如下:
控制器:
MyApp.listController = Ember.ArrayController.create();
$.get('people.json', function(data) {
MyApp.listController.set('content', data);
});
模板:
{{#each MyApp.listController}}
{{firstName}} {{lastName}}
{{/each}}
从这里可以看出,他们首先直接在控制器上设置了带有content
数组的键 data
。在您的情况下,这将是您已经执行的步骤this.set('entities', myArray );
。
在第二步中,他们使用控制器上的#each
助手,而不是密钥。在你的情况下,这将是:
<script type="text/x-handlebars" data-template-name="home" >
{{#if entities}}
{{#each App.HomeController }}
{{id}} {{value}}
{{/each}}
{{/if}}
{{outlet}}
</script>
要访问属性,请按照任何手柄模板进行操作。
从您的评论中我假设您没有将json字符串反序列化为javascript对象。
您从服务器收到的json是一个纯字符串。您必须使用JSON.parse
反序列化它。
示例:
var json = '[{"id":"17","nombre":"Musical dezzer"},
{"id":"172","nombre":"Musical dezzer"}]',
trueResult = JSON.parse(json);
console.log(trueResult);