2014-01-15 2 views
0

Я пытаюсь использовать угловое обещание, используя $ q, который завернут в «службу» и вызовет его из моего контроллера. Вот код:Как реализовать вызов ajax, используя обещание с угловым?

var myController = function ($scope, myService) { 
    $scope.doSomething = function (c, $event) { 
     $event.preventDefault(); 
     myService.method1(c).then(function (rslt) { 
      alert(rslt); 
     }, function (err) { 
      alert(err); 
     }).then(function() { 
      //clean up 
     });   
    }; 
}; 
var myApp = angular.module('myApp', []) 
    .factory('myService', function($q) { 
     function _method1(c) { 
      var dfr = $q.defer(); 

      var dt = { sc: c }; 
      $.ajax({ 
       type: "POST", 
       url: "mypage.aspx/mymethod", 
       data: JSON.stringify(dt), 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       success: function() { 
        dfr.resolve('actions sucess'); 
       }, 
       error: function (msg) { 
        dfr.reject(msg); 
       } 
      }); 
      return dfr.promise; 
     } 
     return { method1: _method1 }; 
    }).controller('myController', myController); 

Проблема заключается в том, что 'тревога (Rslt);' кусок кода никогда не выполняется. Служба вызывается и данные обновляются, но первая функция «тогда» не достигается при первом нажатии.

Что я делаю неправильно? Любая помощь приветствуется.

ответ

2

Просто добавьте зависимость к $rootScope и вызвать $rootScope.$apply() в обоих обратных вызовов из $.ajax():

success: function() { 
    dfr.resolve('actions sucess'); 
    $rootScope.$apply(); 
}, ... 

Но еще лучше, используйте Angular's $http service.

+0

Я не понимаю, почему запуск цикла дайджеста решает этот пример. Когда вы разрешаете() 'обещание (возврат' method1 (c) ', то же ссылка), функция' then() 'должна запускать даже ** без **' $ apply'. Единственное, что я нашел в документах, это: «$ q интегрирован с механизмом наблюдения n-ой модели $ rootScope.Scope ... что означает более быстрое распространение ...». – angabriel

+0

Интеграция углового '$ q' с угловым означает, что он * требует * цикла дайджеста для инициирования изменений. –

+0

Интересно, это ново для меня. У вас есть ссылка на этот кусок документа? – angabriel

3

Я бы recoomend вам использовать $http и $resource вместо $.ajax

Heres пример $http

myApp.factory('MyService', 
[ 
    '$http', 
    '$q', 
    '$resource', 
function (
    $http, 
    $q, 
    $resource 
) { 
    return { 
     doSomething : function (somedata) { 
      var deferred = $q.defer(); 

      $http({ method: 'POST', url: '"mypage.aspx/mymethod"', data: somedata }). 
       success(function (data, status, headers, config) { 
        deferred.resolve(true); 
       }). 
       error(function (data, status, headers, config) { 
        deferred.resolve(false); 
       }); 
      return deferred.promise; 
     } 
    }; 
}]); 
+0

можете ли вы расширить ресурс $? – krul

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