如何将数组对象转换为EmberJS数组

3

我有以下类:

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>,...

如何修复?

尝试使用 this.set('entities', [myArray] ); - Andrei
@Andrei,你好,如果我使用this.set('entities', [myArray] );,那么我将在entities的第一个位置放置一个数组(myArray),不会将myArray转换为EmberArray(或者其他Ember可以迭代的东西)。然后当我渲染我的视图时,我得到了<App.Entity:ember423>,<App.Entity:ember424>,....。如何呈现每个值的内容,{{ this.WHAT??}} - Cristian
1个回答

1

阅读了一些文档后,我了解到应该使用 Ember.ArrayController 来渲染数组。

他们的文档 中的一个示例如下:

控制器:

MyApp.listController = Ember.ArrayController.create();

$.get('people.json', function(data) {
  MyApp.listController.set('content', data);
});

模板:

{{#each MyApp.listController}}
  {{firstName}} {{lastName}}
{{/each}}

正如您在此处看到的,他们首先在控制器上直接使用data数组设置了key content。在您的情况下,这将是您已经完成的步骤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>

要访问属性,您可以像在任何handlebars模板中一样操作。

更新

从您的评论中我推断出您没有将json字符串反序列化为javascript对象。

您从服务器接收到的json是一个普通字符串。您必须使用JSON.parse进行反序列化。

例如:

var json = '[{"id":"17","nombre":"Musical dezzer"},
             {"id":"172","nombre":"Musical dezzer"}]',
    trueResult = JSON.parse(json);

console.log(trueResult);

谢谢,但是不行,我已经将常规数组改成了 JSON 数组,如果我按照您和文档中展示的方式放入视图中,我会收到以下错误消息:Assertion Failed: The value that #each loops over must be an Array. You passed App.HomeController。我尝试使用 {{#each content}},但我收到以下错误:--- ember.js:3521 Uncaught Error: Assertion Failed: The value that #each loops over must be an Array. You passed [{"id":"17","nombre":"Musical dezzer"},{"id":"19",...] - Cristian
现在我遇到了以下错误:断言失败:ArrayProxy期望一个数组或Ember.ArrayProxy,但你传递了字符串。问题是我使用ajax函数从php调用我的Web服务,我使用return json_encode($json);来返回我的数据,但这是一个SOAP Web服务。 - Cristian
根据您的最后一条评论,我有些时间更新了帖子。 - Andrei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接