即使在映射之后,模型属性也为null

时间:2013-05-30 13:29:33

标签: ember.js ember-data

我正在为不符合要求的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);
}

欢迎任何想法!谢谢 :) 附:如果您需要任何其他信息,请与我们联系。

修改Gist到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;
}

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

1 个答案:

答案 0 :(得分:0)

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

尝试定义以下内容,但不包括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字段。

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