Ember-Data:InnerObject有EmptyObjects - 什么不是真的

时间:2017-03-15 09:27:00

标签: json ember.js ember-data

最近,我开始学习Ember数据,我正在使用非常自定义的API编写应用程序。 来自后端的响应格式不正确,因此我通过方法'normalizeResponse'将其规范化为JsonApi,一切正常。

当我想看到来自回复的内容时,问题出现了。当我读到Ember数据时,我了解到如果得到数据(InnerObjects),我将能够通过它获取属性。 InnerObject.get('some_property'),但它对我不起作用。 如果我想要'some_property',我必须编写InnerObject.data.someproperty,它在较长的路径中看起来很糟糕。我使用Ember.debug()来查看此路径,我的浏览器向我显示属性'_data'是EmptyObject,这是不正确的。当我点击它时,它会显示正确内容列表(外观附件)。 难道我做错了什么 ?我忘记了某些事情或误解了Ember-Data? 我将不胜感激任何帮助。

IMAGES:

export default DS.Model.extend({

  facebook: DS.attr(),
  www:  DS.attr(),
  name: DS.attr(),
  street: DS.attr(),
  house_number: DS.attr(),
  postal_code: DS.attr(),
  city: DS.attr(),
  province: DS.attr(),
  picture: DS.attr(),
  x: DS.attr(),
  y: DS.attr()

});
//json api serializer
export default ApplicationSerializer.extend({

  normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {
    return this._super(store, primaryModelClass, this._normalizeSearch(payload), id, requestType);
  },

  _normalizeSearch(shops) {
    let data = shops.map((obj) => {
        return {
          type: "search",
          id: obj.id_sklep,
          attributes: {
            facebook: obj.facebook,
            www: obj.www,
            name: obj.nazwa_sklep,
            street: obj.adres_ulica,
            house_number: obj.adres_nr_domu,
            postal_code: obj.adres_kod,
            city: obj.adres_miasto,
            province: obj.adres_woj,
            picture: obj.zdjecie_sklep,
            x: obj.lat,
            y: obj.lng
          }
        };
    });

    return { data: data  } ;
  }

});

export default Ember.Service.extend({

  getShopsAndServices(pattern) {
    return this.get('store').query('search', {
      fraza: pattern,
      cena_min: 0,
      cena_max: 100,
      id_kat: 1,
      lat: 53,
      lng: 18
    });
  }
  
}

//Controller action: 
    searchRequest(pattern) {
      return pattern.length > this.MIN_CHARS_FOR_SEARCH ? this.get('search').getShopsAndServices(pattern).then((results) => {
        let content = results.get('content').length ? results.get('content') : [];
        if (content) {
          let foo = content[0];
          Ember.Logger.debug(foo)
          Ember.Logger.debug(foo._data.name)
          Ember.Logger.debug(foo.get('name'))
        }
        return this.set('content', results.get('content').length ? results.get('content') : []);
      }) : this.set('content', []);
    },

1 个答案:

答案 0 :(得分:0)

InnerObject.data.someproperty =>这是错误的。
InnerObject.get('some_property') =>这是正确的。

使用无效代码更新您的问题。这样我们就可以确定问题了。

1.query方法返回Promise,这将解析为扩展Ember.ArrayProxy的DS.RecordArray,以便您可以使用所有可用的方法。

2. results.get('content') - 不要访问content属性,

3.您可以通过results.toArray()

将该特殊数组转换为普通数组

4.您甚至可以使用each帮助程序来迭代它,就像这个this.get('search').getShopsAndServices(pattern)返回的普通数组模板一样。