2

我正在为不合格的 JSON 数据实现一个自定义适配器。数据被拉入,但属性没有被具体化。我有以下地图:

// map function has not been overridden - RESTAdapter is super.
DS.ArcGisAdapter.map("App.Cai", {
  caiId: { key: "CAIID" },
  name: { key: "ANCHORNAME" }
});

对于我的主键:

App.restSerializer.configure("App.Cai", {
  primaryKey: "CAIID"
});

像这样使用App.Cai(模型):

var attr = DS.attr,
  belongsTo = DS.belongsTo;

App.Cai = DS.Model.extend({
  caiId: attr("string"),
  name: attr("string")
});

从我的模板中,我通过{{debugger}}&获取此数据(为演示而缩短) {{log item}}

_data: {
  attributes: {
   caiId: null
   name: null
  },
  id: null
},
id:"130012000149"

如您所见,该 id 来自顶层,但低于它并没有映射到那里,caiId也没有映射到name那里。以下是findQuery我的自定义适配器的功能:

findQuery: function(store, type, query, recordArray) {
  var root = this.rootForType(type),
    transformedJSON = {},
    adapter = this,
    rejectionHandler = function (reason) {
      Ember.Logger.error(reason, reason.message);
      throw reason;
    };

  return this.ajax(this.buildURL(root), "GET", {
    data: query
  }).then(function(json){
    var feature,
      index = 0;

    root = root + "s";
    transformedJSON[root] = [];

    for(;index < json.features.length; index++) {
      feature = json.features[index];
      transformedJSON[root].push(feature.attributes);
    }

    adapter.didFindQuery(store, type, transformedJSON, recordArray);
  }).then(null, rejectionHandler);
}

欢迎任何想法!谢谢:) PS如果您需要任何其他信息,请告诉我。

编辑要点到 JSON 数据前/后转换。

编辑2:我想出了一个技巧,但这并不能解决问题。

我扩展了 JSONSerializer 并将其设置为我的适配器的序列化程序。我必须实现keyForAttributeName钩子,如果映射不返回任何东西,这是后备。这是我的实现:

keyForAttributeName: function (type, name) {
  var attributes = (Ember.meta(DS.ArcGisAdapter, true)["DS.Mappable"] || {}).attributes,
    guid = Ember.guidFor(type.toString()),
    result = name;

  if (attributes && guid) {
    result = attributes.values[guid][name].key;
  }

  return result;
}

仍在寻找有关为什么我的模型缺少地图的任何帮助。

4

1 回答 1

0

我猜你的映射中有模型id冲突。在定义模型时,如果调用 API 响应 JSON 的字段,则ember-data根本不需要定义字段。因此,我认为您的模型定义和映射略有错误。ididid

尝试定义以下内容,不包括id,因为这将使用primaryKey覆盖定义。因此,让我们来看看以下内容:

你的映射

DS.ArcGisAdapter.map("App.Cai", {
  name: { key: "ANCHORNAME" }
});

该模型:

var attr = DS.attr;
App.Cai = DS.Model.extend({
  name: attr("string")
});

和适配器primaryKey覆盖:

App.restSerializer.configure("App.Cai", {
  primaryKey: "CAIID"
});

这样,您CAIID将自动设置为id模型的字段。

让我知道它是否有助于解决您的问题。

于 2013-06-10T20:37:38.997 回答