如何从ember模型中获取实际数组?

时间:2014-12-23 12:20:40

标签: ember.js

我有一个hasMany关系的模型:

var Bus = DS.Model.extend({
  model: DS.attr('string'),
  passengers: DS.hasMany('passenger', {async: true})
});

这似乎有效,因为我可以在我的模板中迭代乘客。

现在我希望在我的控制器中有一个可以与乘客做某事的动作。它涉及一些业务逻辑,我需要遍历乘客列表。

我的问题是,当我从控制器中的模型中获取乘客时,它不是一个数组,它是某种对象。如何从此对象获取数组?

以下是我的尝试:

export default Ember.ObjectController.extend({
  actions: {
    start: function() {
      var bus = this.get('model');
      var passengers = model.get('passengers');
      passengers.then(function(passengerArray) {
        var stuff = passengerArray.get('content');
        console.log('The thing that I wish were an array of passengers',passengerArray);
        console.log('The type of that thing',typeof(passengerArray));
      });
    }
  }
});

它给了我object这个类型,它显然是以一种对我来说难以理解的方式包含在内容中。

4 个答案:

答案 0 :(得分:3)

console.log(passengerArray)控制台中的输出是什么如果你使用一个体面的浏览器,你将获得的不仅仅是对象,而且实际上能够获得对象的信息。

当你使用model.get("passengers")时,你得到了一个乘客"乘客的承诺#34; 。使用then是获取数据的正确方法,您将获得一个实现Ember.Array的对象作为当时调用的函数的参数。

如果你想要" raw js Array"您可以使用passengerArray.toArray()函数来获取它,如果您的目标是迭代或获得长度,或者您可以使用emberArray =>提供的方法。 http://emberjs.com/api/classes/Ember.Array.html

正如您在上面的文档中看到的那样content属性至少不公开,甚至可能不存在:)(您也可以尝试passengerArray.get("[]"))来检索"内容& #34;

答案 1 :(得分:0)

你得到的是一个承诺,因为它是async关系。访问实际的数组就是这样做:

bus.get('passengers').then(function(passengers) {
  // passengers is the actual array
});

答案 2 :(得分:0)

当我尝试使用灯具时(因此数据已存在于商店中),我能够使用

获取阵列
var bus = this.get('model');
var passengers = model.get('passengers').get('currentState');

然后我能够使用passengers[0].get('content')(这是我想要的(?))。我的猜测是,从服务器获取数据时,您需要使用

var bus = this.get('model');
var passengers = model.get('passengers');
passengers.then(function(passengerArray) {
  var passengerContent = passengerArray.get('currentState')[0].get('content')
});

答案 3 :(得分:0)

除非需要/需要。这样做:

var bus = this.get('model');
var passengersPromise = bus.get('passengers');

passengersPromise.then(function(passengers) {
  console.log('RecordArray', passengers);

  var passengerArrayWithRecords = passengers.toArray();
  console.log('array with records', passengerArrayWithRecords);

  var passengerArray = passengers.map(function(record) { 
    return record.toJSON();
  });
  console.log('plain array with javascript objects', passengerArray);
});

在此处查看此行动:http://emberjs.jsbin.com/mapiyafaxa/2/edit?html,js,output

参考: