2015-07-08 7 views
2

В моем текущем проекте я использую модели ampersand.js и коллекции rest-collections. Когда я подключаю его к api, у меня возникают проблемы. Апи возвращает объект, как это ...Местоположение атрибута parse для модели или коллекции Ampersand.js

{ 
    type: ..., 
    multi: ..., 
    data: <good stuff> 
} 

Для того, чтобы загрузить данные в модели или коллекции, насколько я понимаю, что мне нужно использовать парсер.

Перейдя по документам, кажется, что я должен поместить синтаксический анализ в модель.

На практике, однако, когда я запускаю выборку из коллекции, она не будет загружать данные в модели, если свойство анализа не находится в коллекции. Однако, когда я запускаю getOrFetch, он не будет загружать данные, если свойство анализа не находится в модели.

Ничего не работает, если я поместил синтаксис как в модель, так и в коллекцию.

На самом деле не имеет смысла, что мне придется его перемещать. Мне нужно знать, где, по-видимому, жить, и что мне нужно сделать, чтобы заставить его работать.

Вот моя модель и коллекции:

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()); 
      } 
     }); 
    } 
}); 
+0

В этом случае, поскольку ваша коллекция делает выборку и не эти модели, это пошло бы в коллекцию.Это не работает? –

+0

В этом проблема. Я попытался поставить синтаксический анализ на модель, коллекцию и т. д. В настоящее время я не увенчался успехом в поиске комбо, где я могу запускать оба fetch и getOrFetch и фактически анализировать ответ. – LeRoy

+0

Что такое свойство 'data' ответа или какая структура данных он содержит? - это массив объектов (соответствующий коллекции) или объект (соответствующий модели)? –

ответ

0

Ну, это зависит от структуры данных ресурса;

Если ожидаемые данные представляют собой массив объектов, то есть клиент запрашивает список , вы должны переопределить parse коллекции. Если ресурс отвечает объектом, то есть клиент запрашивает один элемент , вы переопределите parse модели.

В соответствии с вашим случаем - ресурс возвращает список объектов, поэтому переопределяет parse коллекции для перемещения данных ответа и возврата соответствующего значения.

При условии, что объекты в массиве ответов соответствуют структуре модели, вы не должны переопределять parse модели, чтобы не вмешиваться в конструкцию модели.

На этот вопрос не должно влиять Amerand's getOrFetch, так как он кэширует существующие данные или извлекает модель из ожидаемого ресурса.

Проблема, вероятно, в API вашего сервера (REST). Магистраль выводит ресурс модели из коллекции url, добавляя id модели к URL-адресу в качестве другого сегмента, поэтому, если ваш бэкэнд не работает ни на одном /cases/{id}, любая выборка на модели, привязанной к коллекции, не удастся.

Чтобы решить эту проблему, измените URL модели, переопределив rootUrl или создайте такой ресурс в бэкэнд.

С Backbone документы на model.url:

Возвращает относительный URL, где ресурс в модели будет располагаться на сервере. Если ваши модели находятся где-то в другом месте, переопределите этот метод с правильной логикой. Создает URL-адреса формы: "[коллекция.URL]/[Идентификатор]»по умолчанию, но вы можете переопределить, указав явное UrlRoot, если коллекцию модели не следует принимать во счет.