如何在我的非AMD AngularJS应用程序中加载AMD模块?

时间:2015-10-01 10:29:22

标签: javascript angularjs dojo amd

我有一个AngularJS应用程序,它不使用任何AMD库,因为Angular的依赖注入是我需要的一个好的架构。我被article on medium.com启发了这个设计。

现在我想使用一个内部与AMD from DOJO配合使用的外部库,并仅通过require()(或define())提供其功能。

所以让我们将这个外部模块包装在Angular服务中:

angular.module('myApp')
.factory('myService', function() {
    var result = {};
    require(['dependantModule'], function(mod) {
        result.mod = mod;
    });
    return result;
});

这样我就可以消耗它了:

angular.module('myApp')
.controller('MyController', [ 'myService', function(myService) {
    console.log('mod: ' + myService.mod);
}]);

控制台消耗后,控制台会记录mod: undefined。 原因是require()异步执行它的回调,因此{/ 1>}在 result.mod执行后设置为

重新设计我的整个应用也可以在技术上使用console.log(),但无论如何都不可选,因为外部库不应该强迫我朝一个方向发展。

那么AngularJS使用外部库中的异步AMD模块的最佳方法是什么?

更新

经过更多的研究和试验后,我想出了

require()

但这是首选方式吗?看起来很可疑,因为服务的消费者必须知道注入的东西不是服务本身,而只是一个后来解析为服务的承诺。

更新2

正如我们所看到的,首先声明服务并且angular.module('myApp') .factory('myService', [ '$q', function($q) { var deferred = $q.defer(); require(['dependantModule'], function(mod) { var result = { mod: mod }; deferred.resolve(result); }); return deferred.promise; }]) .controller('MyController', [ 'myService', function(myServicePromise) { myServicePromise.then(function(myService) { console.log('mod: ' + myService.mod); }); }]); 服务中的模块不起作用。另一种方式:

require

因为在
AngularJS注入服务之后执行了需要回调:

require(['dependantModule'], function(mod) {
    angular.module('myApp')
    .factory('myService', function() {
        return {
            mod: mod
        };
    });
});

angular.module('myApp')
.controller('MyController', [ 'myService', function(myService) {
    console.log('mod: ' + myService.mod);
}]);

0 个答案:

没有答案