Ember Data如何写入存储的模型数据的实例

时间:2017-04-08 06:05:13

标签: ember.js ember-data

好的,所以我是Ember的新手所以请耐心等待。

我有一个与不符合JSONAPI标准的API通信的Ember应用程序,因此我开始编写自己的序列化程序以使用Ember Data。但是,我发现当我向同一资源发出多个请求时,数据在写入商店时遇到问题。对同一资源的连续请求始终响应以下错误:

TypeError:无法将对象转换为原始值

根据我的有限理解,这意味着我发送到商店的数据被视为字符串。

在我的申请路线中,我已将findAll写入我的模型' listing-item'像这样:

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

在嵌套的“用户”中路由,当我对列表项数据做任何类型的请求,返回列表项数据的数组响应(query,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 Data对我的数据对象做了什么以发生此错误,以及在格式化我的数据以使Ember数据消耗时我可能做错了什么。

  

更新

似乎只有前3个字段导致发生此错误。如果我注释掉属性&#39; title&#39;,&#39; description&#39;和&#39; buy_now_price&#39;在我的序列化程序中,我没有收到此错误。此外,它似乎只有在我导航到路由时才会出现,如果我在应用程序加载时处于/ user路由,则两个请求都按预期工作。

好的,所以我一直在浏览ember-data代码,发现在internal-model.js文件中有一个setup函数,它查看商店中的当前属性并将它们与正在进行的数据进行比较从序列化器传来。然后它执行assign()将序列化程序的新数据复制到stores对象。但是出于某种原因,我的商店对象似乎有一套“吸气器”。和&#39; setter&#39;从商店回来为有问题的字段(标题,描述和buy_now_price)的功能。我现在需要知道的是为什么这些功能会随之而来,我做了什么导致这个?

Picture of getters/setters on ember-data object

在此先感谢,如果我需要提供更多信息以便提供更好的背景信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

所以我找到了遇到类似问题的人解决问题的方法。

症状如上所述,似乎ember-data正在从商店返回getter和setter函数,并且无法替代我的新值。然而,线索是它只是我在模板中渲染的字段。

问题似乎是我使用Ember Concurrency任务来执行我的数据加载,然后将任务直接传递到模型模板​​的内部组件。像这样的东西(没有经过测试的代码):

错误的模式(我用来体验这个问题的模式)。

//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}}

CORRECT模式似乎如此:

//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属性有关。我们将对此进行进一步的解释,但我现在将其标记为已解决。