2013-08-16 3 views
1

Я хочу сделать функцию, которая извлекает некоторую информацию из URL-адреса ajax. Например, в моей службы, я бы следующий метод:В AngularJS, как автоматически обновлять значение, полученное с помощью ajax?

this.getFavColor = function(id) 
{ 
    return $http.get('/colors/get/' + id); 
} 

И в мой контроллер, я бы сделать следующее:

$scope.favColor = UserService.getFavColor(id); 

Проблема, однако есть $scope.favColor будет назначен обещание в этом case, и единственный способ фактически изменить его на значение, возвращаемое ajax, - установить обратный вызов .success() по обещанию и использовать его для обновления значения.

Однако, это быстро становится громоздким, если у меня есть много вещей, которые нужно извлечь с помощью ajax. Есть ли ярлык, например, может быть это?

this.getFavColor = function(id, variableToChange) 
{ 
    return $http.get('/colors/get/' + id).success(function(jsonResult) 
     { 
     variableToChange = jsonResult.favColor; 
     }); 
} 

И затем, выполнив следующие действия в контроллере:

UserService.getFavColor(id, $scope.favColor); 

Будет ли этот метод действительно работает?

Примечание: Я уже рассмотрел $resource, но я не могу настроить REST api для моего ajax, поэтому, пожалуйста, не предлагайте его.

+0

Это должно сработать. Ты это пробовал? Мое единственное сомнение заключается в том, что возвращающее утверждение возвращает не обещание напрямую, а вызов метода успеха. если успех также возвращает обещание, это прекрасно. Иначе вам не нужно ничего возвращать или сначала взять обещание в переменную, а затем называть успех на нем и вернуть обещание. – Chandermani

+0

@Chandermani Я не пробовал, но я бы предпочел использовать тот способ, который используется '$ resource' для этого. Вы посмотрели код 'angular.resource.js' и можете ли вы понять, как он это делает? –

+0

Вам не нужен API REST для получения данных с помощью '$ resource'. Пока данные json GET будут работать без проблем. Для получения данных требуется только URL-адрес. – Chandermani

ответ

2

Способ $ resource заключается в немедленном возврате пустого объекта, а затем добавлении данных к этому объекту после получения ответа от сервера. Вот почему $ resource может возвращать только объекты или массивы, а не примитивы.

ng-bind (и сокращенное {{}}) фактически разрешает обещания, так что это может быть лучшим решением. Я создал plnkr с тремя различными примерами: http://plnkr.co/edit/WOrU5eMOmsgK4wuiSCHu?p=preview

// data.json: {"color":"Blue"} 

app.service('UserService',function($http, $q){ 
    return { 

    // return value can be accessed by {{value.data.color}} 
    getFavColor: function(id){ 
     return $http.get('data.json'); 
    }, 

    // return value can be accessed by {{value}} 
    getFavColorWithQ: function(id){ 
     var def = $q.defer(); 
     $http.get('data.json').success(function(data){ 
     def.resolve(data.color); 
     }); 
     return def.promise; 
    } 

    // return value can be accessed by {{value.color}} 
    ,resourceExample: function(id){ 
     var response = {}; 
     $http.get('data.json').success(function(data){ 
     response.color = data.color; 
     }); 
     return response; 
    } 
    } 
}); 
+0

Для меня третий вариант, похоже, не обновляет кажется, что он не вызывает часы angularjs. '$ scope. $ apply' может понадобиться, но для меня я получаю сообщение' digest is is progress progress '. Однако второй метод работает отлично. –

+0

Первый метод вернет обещание, и вам придется использовать обратный вызов 'success', верно? –

+1

Вы видели мой пример plnkr? Он показывает, как работают все методы, вам не нужно использовать метод обратного вызова в любом из них. Но как первый, так и второй пример возвращает обещания, просто первый пример возвращает обещание объекту ответа, а второй возвращает обещание к значению – joakimbl

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