【发布时间】:2015-02-19 21:34:29
【问题描述】:
我必须创建一个 AngularJS 模块,其中包含使用 moment.js 的指令和服务。
当模块作为依赖注入时,有没有办法加载这个库?
目标是在应用程序将模块作为依赖项注入时加载 moment.js,并避免最终应用程序与供应商脚本之间的任何配对。
(我知道存在角矩,我对其他库也有类似的问题)
【问题讨论】:
标签: javascript angularjs
我必须创建一个 AngularJS 模块,其中包含使用 moment.js 的指令和服务。
当模块作为依赖注入时,有没有办法加载这个库?
目标是在应用程序将模块作为依赖项注入时加载 moment.js,并避免最终应用程序与供应商脚本之间的任何配对。
(我知道存在角矩,我对其他库也有类似的问题)
【问题讨论】:
标签: javascript angularjs
Angular 的注入器在首次注入时运行服务的工厂函数。您可以在那里加载外部脚本。
但是,当您使用该服务时,这不会“随意”出现,因为脚本是异步加载的,因此您必须始终防止尚未加载的脚本。
例如,您可以在服务的工厂函数中执行以下操作:
.factory("foo", function($q) {
function loadScript(src) {
var script = document.createElement('script');
script.src = src;
document.getElementsByTagName('head')[0].appendChild(script);
return script;
}
var loadPromise = $q(function(resolve) {
loadScript("foo.js").onload = function(){
resolve();
}
});
return {
load: function() {
return loadPromise;
},
doFoo: function() {
// TheFoo is the object created by foo.js
return TheFoo.doFoo();
}
};
});
然后,当你使用它时,例如在控制器中,你必须等到它加载完成:
.controller("MainCtrl", function($scope, foo){
// foo.doFoo(); <== this will fail because it has not yet loaded
foo.load().then(function(){
$scope.prop = foo.doFoo();
});
});
plunker 用于说明
【讨论】:
假设你已经注册了你的库,你可以像这样进行条件注入:
app.service('myDependencyService', function($injector) {
if (your_condition) {
return $injector.get('dependency1');
} else {
return $injector.get('dependency2');
}
});
【讨论】: