У меня есть метод в моем угловом контроллере 1.5, как показано ниже, но я хотел реорганизовать вызов ajax на завод, но у меня проблемы с обещаниями. Я пытаюсь добраться до точки, где в моем контроллере я могу просто вызовите метод, как показано ниже. Это возможно? Я пытаюсь избежать успеха... (function (...) в коде контроллера.
Любая помощь очень ценится.
Попытка перейти на
vm.member = someFactory.getMember(vm.id);
Существующий код рабочего контроллера
vm.myMethod = myMethod;
...
function myMethod() {
someFactory.getMember(vm.id).success(function(response) {
vm.member = response;
});
}
Когда я перемещаю строку getMethod на фабрику, ответ заполняется явно, но как только я возвращаюсь к контроллеру, даже если возвращаемое значение с фабрики является ответом, результат не определен. Я знаю, что это из-за обещаний, но есть ли шаблон дизайна, который я пропускаю, или чистый способ сделать это. Используя мой подход в настоящее время мой контроллер усеян.success(function()...)
Большое спасибо!
Процедура называется обезвреживанием.
Кроме того, тот факт, что success
является устаревшим и должен быть заменен на then
,
someFactory.getMember(vm.id).then(function(response) {
var data = res.data;
...
});
вполне нормально иметь это в контроллере.
Альтернативой этому шаблону является возврат объекта самозаполнения (что-то, что ngResource $resource
делает):
function getMember(...) {
var data = {};
$http(...).then(function (response) {
// considering that response data is JSON object,
// it can replace existing data object
angular.copy(data, response.data);
});
return data;
}
В этом случае контроллер может мгновенно получить ссылку на объект, а привязки свойств объекта {{ vm.member.someProperty }}
будут обновлены с учетом ответа.
Шаблон ограничен объектами (и массивами), скалярные значения должны быть обернуты объектами.