我正在为不符合要求的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;
}
仍在寻找有关为何我的模型缺少地图的任何帮助。
答案 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
字段。
让我知道它是否有助于解决您的问题。