2016-08-21 18 views
3

--Using灰燼數據2.7.1--Ember.JS - 「類型錯誤:internalModel.getRecord不是一個函數」試圖扭轉的記錄的集合

我試圖扭轉集合的訂單時,沒有首先使用toArray()將它們轉換爲數組。這個對象集合來自this.store.findAll('history-item')返回的promise。

我想這樣做的燼方式,而不是讓他們平原的JavaScript。我得到一個TypeError:來自record-array.js的internalModel.getRecord。出於某種原因,當它嘗試執行objectAtContent()時,它所查找的內容似乎沒有類型。通過堆棧跟蹤,我可以看到我處理的對象是[Class],類是歷史項目模型。在objectAtContent()之前調用一些堆棧,被處理的對象將從該歷史項目模型切換到其他沒有type屬性的Class對象。

我能夠使用Ember Inspector正確查看我的數據,並且如果我只是在我的模板上顯示原始記錄集合,它會正確顯示。

有沒有人遇到過這個?

的幾點思考和注意事項:

-Is有什麼特別的findAll()是如何使用它的承諾,因爲它是在後臺重裝是不允許逆轉?我確實希望它繼續重新加載實時數據。

- 我正在使用ember-cli-mirage來模擬我的數據庫和終結點,並且我已按照指示信來操作。我爲mirage使用了未配置的JSONAPIerializer,並且爲ember使用了未配置的JSONAPIAdapter。它可能與從後面發送的元數據有關嗎?它可能與模型或記錄沒有設置有關嗎?有什麼特別的我需要做的?

定義模型並嘗試將其反向的路由段: [注意:我知道在路由中準備數據(排序)可能不是常規,但我只是將其放在此處以便於描述。我通常做它之外的控制器或組件]

model(){ 
    return this.get('store').findAll('history-item').then(function(items){ 
     return items.reverseObjects(); 
    }).catch(failure); 

歷史列表模型聲明:

export default DS.Model.extend({ 
    question: DS.attr('string'), 
    answer: DS.attr('string') 
    }); 

灰燼-CLI-幻影config.js終點:

this.get('/history-items', (schema) => { 
    return schema.historyItems.all(); 
    }); 

Ember-用於歷史項目的Cli-Mirage夾具:

export default [ 
    {id: 1, question: "1is this working?", answer: "Of course!"} 
    } 

錯誤:

TypeError: internalModel.getRecord coming from record-array.js 

當我嘗試創建保存記錄時,也會發生此問題。保存成功,但是當模型重新加載(並嘗試反向)時,它會失敗並出現相同的錯誤。無論是否夾具都沒關係。

控制器:

var newHistoryItem = this.store.createRecord('history-item', { 
    question: question, 
    answer: answer 
    }); 
    newHistoryItem.save().then(success).catch(failure); 

回答

2

我認爲使用toArray是好的,沒有必要推倒重來。即使Ember的enumerable/array方法也是在底層使用toArray來實現的。

我喜歡在控制器/組件上進行轉換,所以路由只關心[URL - >數據]邏輯。我想在這裏我會保持模型鉤回服務器的數據,並在控制器上使用一個計算的屬性:

import Ember from 'ember'; 

export default Ember.Controller.extend({ 

    reversedItems: Ember.computed('model.[]', function() { 
    return this.get('model').toArray().reverse(); 
    }) 
}); 

顫聲:https://ember-twiddle.com/6527ef6d5f617449b8780148e7afe595?openFiles=controllers.application.js%2C

你也使用reverse助手從Ember Composable Helpers並做到這一點的模板:

{{#each (reverse model) as |item|}} 
    ... 
{{/each}} 
+0

'reverseObjects()'應該是工作。但它不起作用。這是預期的行爲還是你找到任何推理呢? – kumkanillam

+0

hm,看起來像它在我附加的旋轉工作 –

+0

在你做'this.store.findAll('history-item')的模型掛鉤。then(function(items){return items.reverseObjects();})'its拋出'TypeError:從record-array.js'來的internalModel.getRecord ..我也試過你的旋轉。 – kumkanillam

2

結果從store.findAllstore.query返回是AdapterPopulatedRecordArray(活陣列),突變的方法,如addObject,addObjects,removeObject,removeObjects, unshiftObject,unshiftObjects,pushObject,pushObjects,reverseObjects,setObjects,shiftObject,clear,popObject,removeAt,removeObject,removeObjects,insertAt應不被使用。

看看相應的discussionProposed PR拋出的錯誤和建議使用toArray()來複制數組而不是變異。

+0

謝謝你的回答!這是我在谷歌拖了幾個小時後得出的結論。我應該早點看過github。 –

+0

我發現,至少對於支持海市蜃樓的服務器,findAll()只返回一個RecordArray,而不是AdapterPopulatedRecordArray。您建議的PR鏈接似乎是陳舊的,但其他人在討論後合併了AdapterPopulatedRecordArray的更改。它修復了store.query調用的問題,但不適用於findAll()。 –

+0

如鏈接討論中所述,store.query()返回非活動數組,而store.filter()和store.findAll()分別返回FilteredRecordArray和RecordArray。這兩個都是實時陣列。無論哪種方式,似乎RecordArrays不應該是可變的,但只有FilteredRecordArray和AdapterPopulatedRecordArray受到良好的錯誤信息保護。 –

相關問題