Расположение атрибута 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, если коллекция модели не должна приниматься во внимание.

Другие вопросы по тегам