2013-05-30 2 views
2

Я реализую пользовательский адаптер для несоответствующих данных JSON. Данные втягиваются, но атрибуты не материализуются. У меня есть следующие карты:Атрибуты модели null, даже после сопоставления

// 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" 

Как вы можете видеть, идентификатор проходит на верхнем уровне, но внизу он не отображается на 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); 
} 

Любые идеи приветствуются! Спасибо :) P.S. Дайте мне знать, если вам нужна какая-либо другая информация.

Редактировать: Gist данные JSON pre/post transform.

Редактировать 2: Я придумал взломать, но это не устраняет проблему.

Я расширил JSONSerializer и установил его как сериализатор для своего адаптера. Мне пришлось реализовать крючок keyForAttributeName, который является резервным, если сопоставления ничего не возвращают. Вот моя реализация:

По-прежнему ищу любую помощь относительно того, почему карта отсутствует для моей модели.

+0

Как выглядит ваша модель «App.Cai»? – intuitivepixel

+0

@intuitivepixel Я обновил свой вопрос, чтобы отразить модель. – knownasilya

+0

По-прежнему ищет некоторые данные. Благодаря! – knownasilya

ответ

0

Я думаю, у вас есть модель id конфликт в вас сопоставления. В ember-data, когда вы определяете модель, вам не нужно определять поле id вообще, если вы отвечаете за API. Поле id JSON называется 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 fi поле вашей модели.

Дайте мне знать, если это поможет решить вашу проблему.

+0

К сожалению, это не помогло, 'caiId' исчез из' _data', но 'name' по-прежнему' null'. «Id» на верхнем уровне все еще верен. – knownasilya

+0

Можете ли вы показать, как выглядит ваш оригинальный JSON от бэкэнда? – intuitivepixel

+0

Вот сущность, показывающая мою исходную полезную нагрузку и после того, как она была преобразована в функцию 'findQuery' выше: https://gist.github.com/knownasilya/5759147 – knownasilya

Смежные вопросы