我有一个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()
但这是首选方式吗?看起来很可疑,因为服务的消费者必须知道注入的东西不是服务本身,而只是一个后来解析为服务的承诺。
正如我们所看到的,首先声明服务并且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);
}]);