如何使用外部SDK获得Angular:(例如,在SDK异步调用后更新DOM)

How To Get Angular To Work With An External SDK: (e.g., Update DOM After SDK Async Calls)

本文关键字:SDK 调用 异步 更新 DOM 例如 外部 何使用 获得 Angular      更新时间:2023-09-26

我正在构建一个客户端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中并在内部进行应用吗?

如何修改SDK,使$scope.apply()不必在异步调用完成后由使用SDK的开发人员编写?

处理它的更好方法是在SDK服务上创建一个angular服务包装器,这样您就不必担心手动调用摘要循环,因为一旦实现了承诺,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(非角度)必须知道什么是$scope,而且它实际上会与角度实现更加紧密地结合在一起。

如果不涉及太多的业务逻辑,您甚至可以在捆绑包中使用$http的角度版本的服务,供角度开发人员使用。