只有在需要AngularJS时才注入模块依赖项(如插件)
Inject module dependency (like plugin) only if needed AngularJS
我有两个页面(我不使用angular
的routing
-这个约束)。
在其中一个例子中,我想使用指令ui-grid
,就像这个演示中一样:
var app = angular.module('myApp', ['ui.grid']);
app.controller('mainCtrl', function($scope) {
$scope.myData = [
{
"firstName": "Cox",
"lastName": "Carney",
"company": "Enormo",
"employed": true
},
{
"firstName": "Lorraine",
"lastName": "Wise",
"company": "Comveyer",
"employed": false
},
{
"firstName": "Nancy",
"lastName": "Waters",
"company": "Fuelton",
"employed": false
}
];
});
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.js"></script>
<script src="http://ui-grid.info/release/ui-grid-unstable.js"></script>
<link rel="stylesheet" href="http://ui-grid.info/release/ui-grid-unstable.css" type="text/css">
<div ng-app="myApp">
<div ng-controller="mainCtrl">
<div id="grid1" ui-grid="{ data: myData }" class="grid"></div>
</div>
</div>
我的问题是,是否有一种方法可以在任何情况下都不向应用程序注入ui-grid
依赖项,而只是在我需要的时候
类似于:
app.controller('mainCtrl', function($scope) {
app.$inject('ui-grid');
});
更新
我试着做:
var ui_grid = $injector.get('ui-grid');
但我有一个错误:
未知提供程序:ui gridProvider<-ui网格
http://errors.angularjs.org/1.2.26/$injector/unp?p0=ui网格提供者%20%3C-%20ui网格
Core Angular API不提供此功能。ocLazyLoad是Angular中用于延迟加载模块和组件的流行库。
你可以在他们的页面上找到更多信息:https://oclazyload.readme.io
或GitHub存储库:https://github.com/ocombe/ocLazyLoad
Core Angular API确实提供了此功能,只需使用模块的"requires"属性@属性部分@https://code.angularjs.org/1.4.7/docs/api/ng/type/angular.Module
var app = angular.module('myApp');
//Page 1 JS
//change below statement as per requirement in different pages
app.requires = ['ui.grid'];
app.controller('mainCtrl1', function($scope) {
}
//Page 2 JS
app.requires = ['ngResource', 'ui.bootstrap', 'ui.calendar'];
app.controller('mainCtrl2', function($scope) {
}
ocLazyLoad也是一个很好的解决方案,但我想"requires"属性将毫不费力地解决您的问题。
在我的项目中,我使用angular.bootstrap()
动态引导角度模块。我有几页不同的模块集。
示例:
var app = angular.module('demo', [])
.controller('WelcomeController', function($scope) {
$scope.greeting = 'Welcome!';
});
angular.bootstrap(document, ['demo']);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-controller="WelcomeController">
{{greeting}}
</div>
$injector
用于检索提供者定义的对象实例、实例化类型、调用方法和加载模块。
var $http = $injector.get('$http');
完成您的用例:
app.controller('mainCtrl', function($scope, $injector) {
$scope.myData = [];
if($scope.loadGrid) {
var ui_grid = $injector.get('ui-grid');
ui_grid.load($scope.myData); //`.load` is just a guess, obviously read your docs
}
});
有关更多信息,请参阅:
- https://docs.angularjs.org/api/auto/service/$injector
- https://github.com/angular/angular.js/wiki/Understanding-Dependency-Injection
在用于注入模块的angularJS中,您应该像以前一样在模块名称后面注入它。
但你有几个步骤可以使用它:
-
用这种双向
npm
或bower
安装它,如下所示:npm install angular-ui-grid
bower install angular-ui-grid
-
然后在index.html:中添加一个
<script>
<link rel="stylesheet" type="text/css"href="/bower_components/angularui-grid/ui-grid.css" /> <script src="/bower_components/angular-ui-grid/ui-grid.js"></script>
- 如果使用
npm
,则应将源路径更改为/node_modules/
- 如果使用
完成这些步骤后,每个模块都可以访问如下模块:
angular.module('my.module', ['ui.grid'])
。
- 将依赖外部库的UMD模块与browserfy捆绑在一起
- 节点模块依赖关系
- 限制npm依赖模块's require(隔离)的用法
- 要求创建空模块作为依赖项加载程序
- 如何使用jasmine节点监视依赖模块内部的方法
- 库中的匿名定义()模块's的依赖关系导致库损坏'的家属
- 角度模块依赖项的命名约定
- JavaScript模块化和依赖注入之间的区别
- ES6模块导入和依赖关系管理
- 要安装依赖项的自定义节点模块
- 阻止浏览包含模块'的依赖关系
- Javascript应用程序作为具有外部依赖关系的AMD模块
- 如何管理不同的 Angular 模块依赖关系
- 打包具有依赖关系的Browser/Server CommonJS模块
- 在 Angular 中动态注入依赖模块
- RequireJS - 先初始化一个依赖模块,然后再加载其他模块
- 将ngAnimate包含为依赖模块时出错
- Javascript在单元测试中用模拟版本修补现有的外部依赖模块方法
- 使用 RequireJS 自动加载依赖模块
- Angularjs中的多依赖模块