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

时间:2014-05-20 06:02:28

标签: javascript arrays ember.js

我有以下课程:

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

如何解决?

1 个答案:

答案 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);