Расположение атрибута parse в модели или коллекции Ampersand.js
В моем текущем проекте я использую модели ampersand.js и коллекции отдыха. Когда я подключаю его к API, у меня возникают проблемы. API возвращает объект, как это...
{
type: ...,
multi: ...,
data: <good stuff>
}
Для того, чтобы загрузить данные в модель или коллекцию, я понимаю, что мне нужно использовать синтаксический анализ.
После просмотра документов мне кажется, что я должен поместить анализ в модель.
Однако на практике, когда я запускаю fetch для коллекции, она не загружает данные в модели, если свойство parse не находится в коллекции. Однако, когда я запускаю getOrFetch, он не будет загружать данные, если свойство parse не находится в модели.
Ничего не работает, если я разбираю как модель, так и коллекцию.
Это действительно не имеет смысла, что я должен переместить это. Мне нужно знать, где жить, и что мне нужно, чтобы заставить его работать.
Вот моя модель и коллекция:
var Case = Model.extend({
ajaxConfig: function () {
return {
headers: {
'x-auth-token': 'testing'
}
};
},
parse: function (response) {
return response.data;
},
props: {
id: 'string',
orgId: 'string',
created: 'string',
lastUpdated: 'string',
}
});
var CaseCollection = RestCollection.extend({
model: Case,
url: '/cases',
ajaxConfig: function () {
return {
headers: {
'x-auth-token': 'testing'
}
};
},
parse: function (response) {
return response.data;
},
getCase: function (caseId, callbackfunc) {
this.getOrFetch(caseId, function (err, model) {
if (err) {
console.log(err);
} else {
callbackfunc(model.toJSON());
}
});
},
getCases: function (callbackfunc) {
this.fetch({
success: function (collection, response) {
callbackfunc(collection.toJSON());
}
});
}
});
1 ответ
Ну, это зависит от структуры данных ресурса;
Если ожидаемые данные являются массивом объектов, т.е. клиент запрашивает список, вы должны переопределить коллекцию parse
, Если ресурс отвечает с помощью объекта, то есть клиент запрашивает один элемент, вы переопределите модель parse
,
Согласно вашему случаю - ресурс возвращает список объектов, поэтому переопределите коллекцию parse
проследить ответные данные и вернуть соответствующее значение.
При условии, что объекты в массиве ответов соответствуют структуре вашей модели, вы не должны переопределять модель parse
как не вмешиваться в конструкцию модели.
Ampersand-х getOrFetch
это не должно быть затронуто, поскольку это только кэширование существующих данных или выборка модели из ожидаемого ресурса.
Возможно, проблема в API вашего сервера (REST). Магистраль получает ресурс модели из коллекции url
, добавив модель id
к URL-адресу как к другому сегменту, поэтому, если ваш бэкэнд ничего не обслуживает в /cases/{id}
любой выбор модели, привязанной к коллекции, завершится неудачно.
Чтобы решить эту проблему, либо измените URL модели, переопределив rootUrl
или создайте такой ресурс в бэкэнде.
Из документации Backbone на model.url
:
Возвращает относительный URL-адрес, где ресурс модели будет расположен на сервере. Если ваши модели находятся где-то еще, переопределите этот метод с правильной логикой. Создает URL-адреса в форме: "[collection.url]/[id]" по умолчанию, но вы можете переопределить, указав явный urlRoot, если коллекция модели не должна приниматься во внимание.