У меня 2 модели и одна коллекция. JobSummary
- это модель, JobSummaryList
- это коллекция JobSummary
предметов, а затем у меня есть JobSummarySnapshot
модель, которая содержит JobSummaryList
:
JobSummary = Backbone.Model.extend({});
JobSummaryList = Backbone.Collection.extend({
model: JobSummary
});
JobSummarySnapshot = Backbone.Model.extend({
url: '/JobSummaryList',
defaults: {
pageNumber: 1,
summaryList: new JobSummaryList()
}
});
Когда я вызываю fetch
для объекта JobSummarySnapshot
, он получает все ... За исключением случаев, когда я перемещаюсь по коллекции summaryList
, все они имеют тип object
, а не JobSummary
.
Полагаю, это имеет смысл, поскольку, кроме объекта defaults
, он не знает, что summaryList
должен иметь тип JobSummaryList
. Я могу просмотреть каждый элемент и преобразовать его в объект JobSummary
, но я надеялся, что есть способ сделать это без необходимости делать это вручную.
Вот мой тестовый код (работает jsfiddle здесь ):
var returnData = {
pageNumber: 3,
summaryList: [
{
id: 5,
name: 'name1'},
{
id: 6,
name: 'name2'}
]
};
var fakeserver = sinon.fakeServer.create();
fakeserver.respondWith('GET', '/JobSummaryList', [200,
{
'Content-Type': 'application/json'},
JSON.stringify(returnData)]);
var callback = sinon.spy();
var summarySnapshot = new JobSummarySnapshot();
summarySnapshot.bind('change', callback);
summarySnapshot.fetch();
fakeserver.respond();
var theReturnedList = callback.getCall(0).args[0].attributes.summaryList;
_.each(theReturnedList, function(item) {
console.log('Original Item: ');
console.log(item instanceof JobSummary); // IS FALSE
var convertedItem = new JobSummary(item);
console.log('converted item: ');
console.log(convertedItem instanceof JobSummary); // IS TRUE
});
UPDATE:
Мне пришло в голову, что я могу переопределить функцию разбора и установить ее таким образом ... У меня есть это сейчас:
JobSummarySnapshot = Backbone.Model.extend({
url: '/JobSummaryList',
defaults: {
pageNumber: 1,
summaryList: new JobSummaryList()
},
parse: function(response) {
this.set({pageNumber: response.pageNumber});
var summaryList = new JobSummaryList();
summaryList.add(response.summaryList);
this.set({summaryList: summaryList});
}
});
Пока это работает. Оставьте вопрос открытым, если кто-то прокомментирует его ...