【问题标题】:Iterating over Ember.js ember-data Record Arrays遍历 Ember.js ember-data 记录数组
【发布时间】:2013-08-09 00:23:40
【问题描述】:

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

  • 站点 1 - 主管 1
  • 站点 1 - 主管 2
  • 站点 2 - 主管 1 (记住,多对多)
  • 站点 2 - 主管 3

我需要将这两个资源整理成一个数组,我可以将它传递给从 Ember.Select 继承(或将继承)的视图。目前我正在尝试使用 Supervisors 控制器上的一个方法,我称之为“flat”,因为它将返回一个表示这些关系的扁平数组。控制器如下图所示。我正在使用 .find().then() 来处理承诺后的数据。我返回的数据似乎包含我的所有四个固定装置,但是当我在它们上尝试任何可枚举方法(特别是 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
    }) ;
  }
}) ;

这是第一个 console.log() 调用的日志输出

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

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

谢谢!

【问题讨论】:

  • 您是否尝试过使用 data.objectAt(index) 而不是直接通过 [] 运算符访问?

标签: javascript ember.js ember-data


【解决方案1】:

看起来您在模型完成加载之前正在访问它们(您可以在属性 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')

【讨论】:

  • 对不起,我在第一篇文章中错过了,你能生成一个显示错误的 jsbin/jsfiddle 吗?
  • 谢谢你看这个,丹尼尔。我把它放在一个 jsbin 中:jsbin.com/ijiqeq/3/edit。在 bin 中运行它显示数据对象有四个项目,但是当我遍历它们时 all 的所有项目都显示为 null,这很奇怪,让我觉得第一个项目以某种方式被设置了在我的代码的其他地方。不知道这怎么可能发生。所以我现在有点困惑......
  • 只是为了澄清 - 项目显示undefined,而不是null
  • hmmmm,我想我明白了,所以你有点想要一个左连接(为每个站点复制一个主管)。所以我建议不要这样做,因为这样你就可以为主管提供不止一个事实来源。 Aka,如果您在主管模型上更改某些内容,则必须寻找应该是相同模型的其余主管模型并更新它们。你能举个例子说明你为什么要复制模型吗?也许我可以举一个变通方法的例子来给你同样的结果。
  • 我会根据模型生成一个额外的数组。我会把它放在上面。
猜你喜欢
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2014-05-08
  • 1970-01-01
  • 2012-12-16
  • 2014-06-20
相关资源
最近更新 更多