8

我有一个异步加载到我的页面的第三方库,我想将它用作服务。

如何将加载代码包装在角度服务中?一般来说,最佳做法是什么?

目前我的方法是这样的:

angular.module('myAPIServices', []).
factory('MyAPI', function () {
    return {
        \\ API is declared at the loaded script
        doStuff:function(){$window.API.doStuff()} 
    };
});

然后在 Angular 范围之外的页面上

(function () {
    var js = document.createElement('script');
    var loc = document.getElementsByTagName('script')[0];
    js.async = true;
    js.src = "myAPI.js";
    loc.parentNode.insertBefore(js, loc);
}());
4

1 回答 1

4

一种可能性是将您的库调用包装在$q中。此 Angular 服务返回一个承诺,您可以在库完全加载时解决该承诺。

您的doStuff功能将类似于:

doStuff: function() {
   var deferred = $q.defer();

   myAsyncCall().success(function(data) {
      deferred.resolve(data);
   });
   return deferred.promise;
}

在您的控制器中,您使用该then()功能来处理结果。

第二种可能性是回调。这是两种类型的示例

If your library is manipulating the DOM, it is better to wrap it in a directive.

于 2013-01-01T08:57:58.927 回答