Я создаю клиентский javascript SDK. Это упрощает запросы к внешнему API.

Но при использовании его в Angular я должен включить $ scope.apply (), как это, чтобы обновить DOM.

SDK.getUser(function(response) {
            // Have to call $scope.$apply since SDK call is asynchronous and therefore updates outside of the AngularJS digest cycle
            $scope.$apply(function() {
                    $rootScope.user = response.user;
            });
    }, function(error) {
            console.log('Error Fetching User From SDK: ', error);
    });

Как я могу изменить SDK, чтобы $ scope.apply () не записывался разработчиками, использующими SDK, после завершения его асинхронных вызовов?

Могу ли я передать $ scope в SDK и применить его внутри?

1
ac360 26 Авг 2014 в 06:23
2
Вместо этого вы можете обернуть его в сервис angular и использовать обещания $q, которые обеспечат вызов цикла дайджеста без необходимости делать это вручную.
 – 
PSL
26 Авг 2014 в 06:26
Поскольку вы выходите за пределы области действия angular, вам потребуется применить файл apply. Вам необходимо определить модуль angular или директиву для написания SDK. Чтобы избежать применения $
 – 
V31
26 Авг 2014 в 06:26

1 ответ

Лучший ответ

Как я могу изменить SDK, чтобы $ scope.apply () не записывался разработчиками, использующими SDK, после завершения его асинхронных вызовов?

Лучшим способом справиться с этим было бы создание оболочки службы angular над службой SDK, чтобы вам не нужно было беспокоиться о ручном вызове цикла дайджеста, поскольку angular будет вызывать цикл после выполнения обещания и для каждого обратного вызова в обещании цепь.

app.service('SDKWrapperService', ['$q',function($q){
  this.getUser = function() {
     var def = $q.defer();
     SDK.getUser(function(response) {
        def.resolve(response);
     },function(error) {
         def.reject('Error Fetching User From SDK: ', error);
    });
     return def.promise;
  }
}]);

И используйте это как-то так: -

app.controller('myCtrl',['$scope','SDKWrapperService', function($scope, SDKWrapperSvc){
      SDKWrapperSvc.getUser().then(function(data){
         $scope.user = data.user;
      })
 });

Могу ли я передать $ scope в SDK и применить его внутри?

Я бы, вероятно, не стал этого делать, поскольку ваш клиентский javascript SDK (не angular) должен будет знать о том, что называется $scope, и на самом деле он будет более тесно связан с angular выполнение.

Если задействовано не слишком много бизнес-логики, у вас может быть даже угловая версия вашего сервиса, использующая $http в вашем наборе для разработчиков Angular.

2
PSL 26 Авг 2014 в 06:42
Выглядит великолепно. Спасибо :)
 – 
ac360
26 Авг 2014 в 08:04