Embedded data from RestApi

2019-07-26 19:57发布

My data comes from REST API like this:

customers:[
    id:3,
    name:"Joue",
    currency:{
        id:5
        iso_code:"BDT"
    }

]

My model:

App.Customer = DS.Model.extend({
        name: DS.attr('string'),
        currency: DS.attr('string')

});

i populated a select box with the availabe currencies and now i want to select by "id" 5. Since currency is embedded and its interpreted as string i cant access it. As far as i know embedded records are no longer supported in ember-data 1.0.

do i have to rewrite my REST Api and get rid of the relationships or there is a workaround .

2条回答
The star\"
2楼-- · 2019-07-26 20:15

currency is not "embedded", it's just an object. Don't declare it as a string in your model:

currency: DS.attr()

You say you want to "select" by id--what do you actually want to do? You can access the properties of currency directly:

{{! handlebars }}
Your currency id is {{currency.id}}.

// Javascript
id = model.get('currency.id');

No need for additional complexity involving serializers or additional models. However, you need to be careful when changing currency id, since

model.set('currency.id', 6)

will not dirty the model and it won't save. You'll need to also incant

model.notifyPropertyChange('currency')
查看更多
别忘想泡老子
3楼-- · 2019-07-26 20:21

You can just create a custom serializer for the data.

Using your data (slightly modified, since the json isn't valid, and I'm guessing that's just cause it was hand written?)

{
    customers:[
     {
      id:3,
      name:"Joue",
      currency:{
        id:5,
        iso_code:"BDT"
      }
    }
   ]
}

Here's a serializer for that particular response type (read more about it here https://github.com/emberjs/data/blob/master/TRANSITION.md)

App.CustomerSerializer = DS.RESTSerializer.extend({
  extractArray: function(store, type, payload, id, requestType) {
    var customers = payload.customers,
        currencies = [];

    customers.forEach(function(cust) {
      var currency = cust.currency;
      delete cust.currency;
      if(currency){
        currencies.push(currency);
        cust.currency = currency.id;
      }
    });

    payload = { customers:customers, currencies: currencies };

    return this._super(store, type, payload, id, requestType);
  }
});

And your models defined with a relationship

App.Customer = DS.Model.extend({
    name: DS.attr('string'),
    currency: DS.belongsTo('currency')
});

App.Currency = DS.Model.extend({
    iso_code: DS.attr('string')
});

Example:

http://emberjs.jsbin.com/OxIDiVU/535/edit

查看更多
登录 后发表回答