2016-07-27 2 views
0

У меня есть метод в моем угловом контроллере 1.5, как показано ниже, но я хотел реорганизовать вызов ajax на завод, но у меня проблемы с обещаниями .. Я пытаясь добраться до точки, где в моем контроллере я могу просто вызвать метод, как показано ниже. Это возможно? Я стараюсь, чтобы избежать в ... успех (функция (...) в коде контроллера.как вернуть значение из обещания ajax

Любая помощь очень ценится.

Попытка перейти к

vm.member = someFactory.getMember(vm.id); 

существующих рабочего код контроллера

vm.myMethod = myMethod; 
... 

function myMethod() { 
    someFactory.getMember(vm.id).success(function(response) { 
     vm.member = response; 
    }); 
} 

Когда я переместить линию getMethod на завод ответ заполняется явно, но как только я вернусь к контроллеру, даже если возвращаемое значение от фабрики является ответом, результат не определен. Я знаю, что это из-за обещаний, но есть ли шаблон дизайна, который я пропускаю, или чистый способ сделать это. Используя мой подход в настоящее время мой контроллер засорен .success (function() ...)

Большое спасибо!

ответ

0

Процедура называется обезвреживанием.

Помимо того, что 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 }} будет обновляться с учетом ответа.

Шаблон ограничен объектами (и массивами), скалярные значения должны быть обернуты объектами.

Смежные вопросы