CanJS список объектов автоматическое создание подклассов и переклассификации
Удаленный сторонний сервер JSONP предоставляет моему сценарию CanJS список результатов, подобных этому:
[
{ "class": "ABaseClass", "value": "1"},
{ "class": "ASubClass", "value": "2"},
{ "class": "ABaseClass", "value": "3"},
{ "class": "ASubClass", "value": "4"},
...
]
где type
является целевым классом объекта, определенным в CanJS с помощью can.Model.extend
:
Следующий упрощенный код демонстрирует установку CanJS:
ABaseClass = can.Model.extend({ ... }, {
'findAll': { 'url': 'the url', 'dataType': "jsonp" }
// this is modified source code and may not run
});
// ASubClass is a subclass of ABaseClass.
ASubClass = ABaseClass.extend({ ... }, { ... });
Проблема:
когда ABaseClass.findAll({}, function(data) { ... })
называется, который вызывает конечные точки JSONP для большего количества объектов, обратный вызов получает список моделей CanJS, но только класса ABaseClass
,
Вопрос:
Существует ли вспомогательный метод, предоставляемый CanJS для автоматического создания подклассов на основе поля в списке объектов? Если нет, то как я могу реализовать его?
Ожидаемый результат:
[
(new ABaseClass(...)),
(new ASubClass(...)),
(new ABaseClass(...)),
(new ASubClass(...)),
...
]
Среда:
- CanJS: 1,17
- JQuery: 1.10.1
- Я не могу контролировать, какие типы объектов возвращает конечная точка.
- Многократные вызовы AJAX не являются принятым решением.
1 ответ
Самый простой способ сделать это - переопределить models
метод и найти правильную модель для класса, как это:
ABaseClass = can.Model.extend('ABaseClass', {
'findAll': { url: "/the_url", dataType: "jsonp" },
models: function(results){
return_models = new can.List();
can.each(results, function(result){
return_models.push( window[result.class].model(result.value) )
})
return return_models;
}
}, {});
ASubClass = ABaseClass.extend('ASubClass', {}, {});
ABaseClass.findAll({}, function(results){
console.log(results);
})
Что это делает:
- Когда
findAll
возвращает отправляет свой результатmodels
метод. models
Затем метод перебирает каждый из результатов.- Затем он находит конструктор модели, прикрепленный к окну. (
window[result.class]
) - Тогда мы называем
model
на конструкторе для создания / обновления экземпляра модели. - Добавить экземпляр модели в
can.List
и верни это.
Я проверил это в CanJS 2.0.x, и он отлично работает здесь.
Вы можете найти более подробную информацию о том, как это все работает, в документации:
Похоже, что они будут устаревшими в CanJS 2.1.0 в пользу .parseModels
а также .parseModel