在Ember.js Ember数据记录数组上迭代

Iterating over Ember.js ember-data Record Arrays

本文关键字:Ember 迭代 数组 数据 js 记录      更新时间:2023-09-26

我一整天都在为这个问题绞尽脑汁,我觉得我已经接近解决方案了,但就是无法实现。我将Ember.js与EmberData和Fixtures适配器一起使用,最终迁移到REST适配器。基本问题是:我有站点和主管,有多对多关系。我想向用户展示一个选择框,用于他们现有的站点/主管配对,按站点排序,即:

  • 现场1-主管1
  • 现场1-监督员2
  • 站点2-主管1(记住,多对多)
  • 现场2-监督员3

我需要将这两个资源合并为一个数组,我可以将其传递给继承(或将继承)Ember.Select的视图。目前,我正在Supervisors控制器上尝试使用一个方法,我称之为"平面",因为它将返回一个表示这些关系的平面数组。控制器如下所示。我使用.find().then()来处理承诺完成后的数据。我返回的数据显示为包含我的所有四个fixture,但当我在它们上尝试任何可枚举方法(尤其是forEach)时,它的行为就像只返回了第一个对象。我已经尝试过迭代数据对象以及data.get('content')。我对Ember很陌生,所以也许我无论如何都错了,但不管怎样,这对我来说似乎很奇怪。下面是我的代码:

App.SupervisorsController = Ember.ArrayController.extend({
  flat: function(){
    return App.Supervisor.find().then(function(data){
      var c = data.get('content') ;
      console.log(c) ;    // <-- logs an object containing four records,
                          //     with attribute "length" showing 4
                          //     Great! (see below for log output)
      console.log(c[0]) ; // <-- logs first record. Great!
      console.log(c[1]) ; // <-- undefined (?!)
      console.log(c[2]) ; // <-- undefined (?!)
      console.log(c[3]) ; // <-- undefined (?!)
      console.log(c.get('length')) ; // <-- 1 (not four?!)
      return c ; // <-- eventually this will return the newly constructed array
    }) ;
  }
}) ;

下面是第一个控制台的日志输出。log()调用

0: Object
1: Object
2: Object
3: Object
__ember1376005434256: "ember325"
__ember1376005434256_meta: Meta
_super: undefined
length: 4
__proto__: Array[0]

你能告诉我我在这里缺了什么吗?我不知道如何访问由此产生的四位主管中的每一位。

谢谢!

在模型加载完成之前,您似乎正在访问它们(您可以在属性isUpdating中看到这一点)。如果你想懒洋洋地看这个,你可以稍后使用ember run来稍后查看项目。或者,您可以在控制器上设置模型并渲染它,并在模型加载完成时让ember更新视图。。。

 Ember.run.later(function(){
    data.forEach(function(item){
    console.log(item);
   });
 }, 2000);

 App.ApplicationRoute = Ember.Route.extend({
   activate: function(){
     this.controllerFor('supervisors').set("model", App.Supervisor.find());
   }
 });

http://jsbin.com/ijiqeq/12/edit

祝Ember好运!

 someArray: function(){
   var arr = Ember.A();
   this.get('model').forEach(function(item){
     item.get('sites').forEach(function(site){
       arr.pushObject(someObject); //some object that is represents each specific combination
     });
   });
 }.property('model')