2014-12-23 91 views
1

我有一個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,這顯然是東西包裹在emberness的方式,是無法理解的我。

+0

你從服務器回來了什麼?你可以在emberjs.jsbin.com中重現嗎? – Asgaroth

+0

我現在無法嘗試,現在是我停止遊戲並開始工作的時候了。我根本沒有碰到服務器,不過,我目前正在使用燈具。 –

+0

它可能會返回一個[RecordArray](http://emberjs.com/api/data/classes/DS.RecordArray.html),也許它是空的?它確實是[Ember.Array](http://emberjs.com/api/classes/Ember.Array.html) – Asgaroth

回答

0

你得到的是一個承諾,因爲它是一個async關係。訪問實際陣列只是做:

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

不,我也在那裏得到一個對象,我應該指定,我會編輯我的問題。 –

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

什麼在console.log(passengerArray)的控制檯輸出,如果你使用一個體面的瀏覽器,你會得到更多的不僅僅是對象和實際beeing能獲取有關您的對象的信息。

一些如何當你使用model.get("passengers")你得到一個PromiseArray你的「乘客」。使用then是獲取數據的正確方法,您將獲得一個實現Ember.Array的對象,作爲在該函數中調用的函數的參數。

如果你想要一個「原始JS數組」您可以通過使用passengerArray.toArray()功能得到它,如果你的目標是要遍歷或得到lenght或什麼都可以使用由emberArray =>http://emberjs.com/api/classes/Ember.Array.html

提供的方法正如你在上面的文檔中看到的content財產至少不公開或甚至不存在:)(你也可以嘗試一個passengerArray.get("[]"))來檢索「內容」

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

參考:

相關問題