2017-04-08 21 views
2

好的,所以我是Ember的新手,所以請耐心等待。Ember Data如何通過存儲的模型數據實例寫入

我有一個Ember應用程序正在與不符合JSONAPI標準的API進行通信,因此我已經開始編寫自己的序列化程序以便使用Ember數據。但是我發現,當我向同一資源發出多個請求時,數據在寫入商店時遇到問題。連續請求相同的資源總是以下面的錯誤響應:

類型錯誤:無法轉換對象原始值

從我有限的理解,意味着我發送到存儲中的數據是被視爲一個字符串。

在我的申請途徑我已經寫了findAll我的模式「掛牌項目」,像這樣:

model: function() { 
    return this.store.findAll('listing-item'); 
}, 

在嵌套「用戶」的路線,當我做任何類型的請求爲listing-用於返回列表項數據的陣列響應(查詢的findAll)項數據,我得到:

TypeError: Cannot convert object to primitive value 

at EmptyObject.SETTER_FUNCTION [as title] (ember.debug.js:20672) 
at assign (<anonymous>) 
at InternalModel.setupData (internal-model.js:244) 
at Class._load (store.js:1728) 
at Class._pushInternalModel (store.js:2055) 
at Class._push (store.js:1995) 
at finders.js:141 
at Backburner.run (ember.debug.js:720) 
at Class._adapterRun (store.js:2253) 
at finders.js:139 

(名稱是我上市項目模型中的字段)。

正如我前面提到的,我的API不符合JSONAPI的標準,所以我寫了一個上市項目串行像這樣:

import DS from 'ember-data'; 

export default DS.RESTSerializer.extend({ 

    normalizeArrayResponse(store, primaryModelClass, payload) { 

    payload.data = []; 
    payload.listing_item._data.forEach(this.formatListingItemArray, payload.data); 
    delete payload.listing_item; 

    return payload; 
    }, 

    formatListingItemArray(listingItem) { 
    this.push({ 
     type: "listing-item", 
     id: listingItem.id, 
     attributes: { 
     title: listingItem.title, 
     description: listingItem.description, 
     buy_now_price: listingItem.buy_now_price, 
     created_at: listingItem.created_at, 
     category_id: listingItem.category_id, 
     subcategory_id: listingItem.subcategory_id, 
     identity_id: listingItem.identity_id, 
     listing_number: listingItem.listing_number, 
     brand_new: listingItem.brand_new, 
     sold: listingItem.sold, 
     }, 
    }); 
    }, 

}); 

,所以我想我的問題是,什麼是灰燼數據做與我的數據對象發生此錯誤,以及我的數據格式化爲Ember數據使用時可能會做錯什麼。

UPDATES:

它看起來好像只有前3個字段導致此錯誤發生。如果我在序列化程序中註釋掉屬性「標題」,「描述」和「buy_now_price」,我不會收到此錯誤。此外,似乎只有在導航到路由時纔會出現這種情況,如果我在應用程序加載時處於/用戶路由中,兩個請求都按預期工作。

好了,所以我一直在爬行通過餘燼數據的代碼,發現在內部model.js文件中,有一個設置功能,着眼於在店裏的當前屬性,並將它們與傳遞的數據來自序列化程序。然後它執行assign()將序列化器新數據複製到商店對象。然而由於某種原因,我的商店對象似乎有一組「getter」和「setter」函數,它們從存儲中返回有問題的字段(標題,描述和buy_now_price)。我現在需要知道的是,爲什麼這些功能會在騎行中出現,我爲此做了些什麼?

Picture of getters/setters on ember-data object

在此先感謝,讓我知道,如果有任何需要我,爲了提供更好的背景下,以提供更多的信息。

回答

0

因此,我找到了解決我遇到類似問題的任何人遇到的問題的解決方案。

症狀如上所述,好像是燼數據從商店返回getter和setter函數,並有問題代替我的新值。但是線索是,它只是我在模板中渲染的字段。

的問題似乎是,我用灰燼併發任務來執行我的數據的加載,然後通過任務直接在從模型模板的內部組件。事情是這樣的(未測試的代碼):

錯誤的模式(一個我使用體驗的問題)。

//route file - application.js 
export default Ember.Route.extend({ 

    model: function() { 
    return { 
     listings: this.get('getListings').perform(), 
    }; 
    },  

    getListings: task(function *() { 
    return yield this.store.findAll('listing-item'); 
    }), 

}) 


//application template - application.hbs 
{{listing-index listings=model.listings}} 


//listing index component template.hbs 
{{#if listings.value}} 
    {{#each listings.value.content as |listing|}} 
    {{listing._data.title}} 
    {{listing._data.description}} 
    {{listing._data.buy_now_price}} 
    {{/each}} 
{{/if}} 

正確的模式似乎是這樣的:

//route file - application.js 

export default Ember.Route.extend({ 

    model: function() { 
    return { 
     listings: this.get('getListings').perform(), 
    }; 
    },  

    getListings: task(function *() { 
    return yield this.store.findAll('listing-item'); 
    }), 

}) 


//application template - application.hbs 
{{#if listings.value}} 
    {{listing-index listings=model.listings.value}} 
{{/if}} 


//listing index component template.hbs 
{{#each listings as |listing|}} 
    {{listing.title}} 
    {{listing.description}} 
    {{listing.buy_now_price}} 
{{/each}} 

所以,問題似乎在於傳遞任務,而不是任務的內容在我的組件的這種模式。當我在模型模板架設到列表,然後通過上市直接到組件,它似乎已經解決了我的問題。我收集這是使用這些_data屬性。進一步的解釋將不勝感激,但我會將此標記爲現在已解決。

相關問題