2017-04-08 1 views
2

Ok、私はEmberのことをとても熟知しています。Ember Dataは、保存されたモデルデータのインスタンスに対してどのように書き込むのですか?

EmberアプリケーションがJSONAPI標準に準拠していないAPIと通信しているため、Ember Dataを使用するために独自のシリアライザを作成し始めました。しかし、私は、同じリソースに複数のリクエストを行うと、そのデータがストアに書き込むのに問題があることを発見しています。同じリソースへの連続したリクエストは、常に次のエラーで応答します。

はTypeError:私の限られた理解から、私は店に送付していたデータがあることを意味するプリミティブな値

にオブジェクトを変換できません。文字列のように扱われます。

私はLIKE「項目を列挙し」私のモデルに findAllを書かれている私のアプリケーションのルートで

:私はlisting-の要求のいずれかのタイプを行う際に、ネストされた「ユーザー」ルートで

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

リスト項目のデータのためのアレイ応答(クエリ、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のフィールドは、このエラーが発生する原因になっているかのように見えます。シリアライザで 'title'、 'description'、 'buy_now_price'の属性をコメントアウトすると、このエラーは発生しません。また、これは、ルートに移動するときにのみ発生します。アプリケーションがロードされるときに/ userルートにある場合、両方の要求が期待通りに機能します。

私はember-dataコードをクロールしており、internal-model.jsファイルには、ストア内の現在の属性を調べ、渡されるデータと比較するセットアップ機能があることがわかりましたシリアライザから。次に、シリアライザの新しいデータをストアオブジェクトにコピーするassign()を実行します。しかし何らかの理由で、私のストアオブジェクトは、問題のあるフィールド(タイトル、説明、およびbuy_now_price)のストアから戻って来るgetterおよびsetter関数のセットを持っているようです。私が今知る必要があるのは、なぜこれらの機能が乗って来るのか、これを引き起こすために何をしたのですか?

Picture of getters/setters on ember-data object

事前のおかげで、私はより良いコンテキストを与えるために提供する必要がある任意のより多くの情報がありますなら、私に知らせてください。

答えて

0

だから私は同じような問題が発生した人のために私の問題を解決しました。

上記の症状は、ember-dataがgetterとsetter関数を店から返却していて、代わりに新しい値を配置しているように思えました。しかし、私のテンプレートでレンダリングしていたのはフィールドだけでした。

問題は、Ember Concurrencyタスクを使用してデータのロードを実行してから、モデルテンプレートの内部コンポーネントにタスクを直接渡していたようです。このようなもの(テストされたコードではない):

WRONGパターン(問題を経験するために使用していたもの)。

//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プロパティの使用と関係があるものです。さらなる説明は分かりますが、私はこれを今解決されたものとしてマークします。

関連する問題