我刚刚开始学习 Angular 并按照这里的教程进行操作 - http://docs.angularjs.org/tutorial/step_00
我从 GitHub 下载了种子示例,效果很好。不过我有一个问题——如果局部视图需要引用外部 js 文件,是否需要在开始时将其添加到 index.html 文件中?我希望应用程序尽可能精简,并且只想包含当前视图所需的 js 引用。是否可以基于视图动态加载 js 文件?
我刚刚开始学习 Angular 并按照这里的教程进行操作 - http://docs.angularjs.org/tutorial/step_00
我从 GitHub 下载了种子示例,效果很好。不过我有一个问题——如果局部视图需要引用外部 js 文件,是否需要在开始时将其添加到 index.html 文件中?我希望应用程序尽可能精简,并且只想包含当前视图所需的 js 引用。是否可以基于视图动态加载 js 文件?
这对我有用。想我会把它发布给其他寻求最轻量级解决方案的人。
我在页面的 html 标记上有一个顶级控制器,每个部分视图都有一个辅助控制器。
在顶层控制器中,我定义了以下函数……</p>
$scope.loadScript = function(url, type, charset) {
if (type===undefined) type = 'text/javascript';
if (url) {
var script = document.querySelector("script[src*='"+url+"']");
if (!script) {
var heads = document.getElementsByTagName("head");
if (heads && heads.length) {
var head = heads[0];
if (head) {
script = document.createElement('script');
script.setAttribute('src', url);
script.setAttribute('type', type);
if (charset) script.setAttribute('charset', charset);
head.appendChild(script);
}
}
}
return script;
}
};
因此,在辅助控制器中,我可以通过如下调用加载所需的脚本……</p>
$scope.$parent.loadScript('lib/ace/ace.js', 'text/javascript', 'utf-8');
在外部脚本中包含的对象可用之前会有一点延迟,因此您需要在尝试使用它们之前验证它们的存在。
希望能节省一些时间。
我刚刚尝试了https://oclazyload.readme.io/。它开箱即用。
bower install oclazyload --save
将其加载到您的模块中,并在控制器中注入所需的模块:
var myModule = angular.module('myModule', ['oc.lazyLoad'])
.controller('myController', ['$scope', '$ocLazyLoad', '$injector',
function($scope, $ocLazyLoad, $injector) {
$ocLazyLoad.load(
['myExtraModule.js',
'orAnyOtherBowerLibraryCopiedToPublicFolder.js'
])
.then(function() {
// Inject the loaded module
var myExraModule = $injector.get('myExtraModule');
});
}
]);