仅在需要时注入模块依赖项(如插件)AngularJS
Inject module dependency (like plugin) only if needed AngularJS
我有 2 个页面(我没有使用 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');
但是我有一个错误:
Unknown provider: ui-gridProvider <- ui-grid
http://errors.angularjs.org/1.2.26/$injector/unpr?p0=ui-gridProvider%20%3C-%20ui-grid
$injector
is used to retrieve object instances as defined by provider, instantiate types, invoke methods, and load modules.
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
}
});
有关详细信息,请参阅:
核心 Angular API 不提供此功能。 ocLazyLoad 是 Angular 中用于延迟加载模块和组件的流行库。
您可以在他们的页面上找到更多信息:
https://oclazyload.readme.io
或 GitHub 存储库:
https://github.com/ocombe/ocLazyLoad
在用于注入模块的 angularJS 中,您应该像以前一样在模块名称后注入它。
但是您只需几个步骤就可以使用它:
用这两种方式安装它 npm
或 bower
如下所示:
npm install angular-ui-grid
bower install angular-ui-grid
然后添加一个<script>
到你的index.html:
<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'])
.
在我的项目中,我使用 angular.bootstrap()
动态 bootstrap angular 模块。我有几个包含不同模块集的页面。
示例:
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>
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' 属性 会毫不费力地解决您的问题。
我有 2 个页面(我没有使用 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');
但是我有一个错误:
Unknown provider: ui-gridProvider <- ui-grid
http://errors.angularjs.org/1.2.26/$injector/unpr?p0=ui-gridProvider%20%3C-%20ui-grid
$injector
is used to retrieve object instances as defined by provider, instantiate types, invoke methods, and load modules.
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
}
});
有关详细信息,请参阅:
核心 Angular API 不提供此功能。 ocLazyLoad 是 Angular 中用于延迟加载模块和组件的流行库。
您可以在他们的页面上找到更多信息: https://oclazyload.readme.io
或 GitHub 存储库: https://github.com/ocombe/ocLazyLoad
在用于注入模块的 angularJS 中,您应该像以前一样在模块名称后注入它。
但是您只需几个步骤就可以使用它:
用这两种方式安装它
npm
或bower
如下所示:npm install angular-ui-grid
bower install angular-ui-grid
然后添加一个
<script>
到你的index.html:<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'])
.
在我的项目中,我使用 angular.bootstrap()
动态 bootstrap angular 模块。我有几个包含不同模块集的页面。
示例:
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>
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' 属性 会毫不费力地解决您的问题。