I have 2 pages (I don't use the angular
's routing
- This constraint).
In one of them I want to use the directive ui-grid
like in this demo:
var app = angular.module('myApp', ['ui.grid']);
app.controller('mainCtrl', function($scope) {
$scope.myData = [
{
"firstName": "Cox",
"lastName": "Carney",
"pany": "Enormo",
"employed": true
},
{
"firstName": "Lorraine",
"lastName": "Wise",
"pany": "Comveyer",
"employed": false
},
{
"firstName": "Nancy",
"lastName": "Waters",
"pany": "Fuelton",
"employed": false
}
];
});
<script src=".2.26/angular.js"></script>
<script src=".js"></script>
<link rel="stylesheet" href=".css" type="text/css">
<div ng-app="myApp">
<div ng-controller="mainCtrl">
<div id="grid1" ui-grid="{ data: myData }" class="grid"></div>
</div>
</div>
I have 2 pages (I don't use the angular
's routing
- This constraint).
In one of them I want to use the directive ui-grid
like in this demo:
var app = angular.module('myApp', ['ui.grid']);
app.controller('mainCtrl', function($scope) {
$scope.myData = [
{
"firstName": "Cox",
"lastName": "Carney",
"pany": "Enormo",
"employed": true
},
{
"firstName": "Lorraine",
"lastName": "Wise",
"pany": "Comveyer",
"employed": false
},
{
"firstName": "Nancy",
"lastName": "Waters",
"pany": "Fuelton",
"employed": false
}
];
});
<script src="http://ajax.googleapis./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>
My question is if there is a way to not inject the ui-grid
dependency to the app in any case but only when I need it.
Something like:
app.controller('mainCtrl', function($scope) {
app.$inject('ui-grid');
});
Update
I tried to do:
var ui_grid = $injector.get('ui-grid');
But I've got an error:
Share Improve this question edited Dec 17, 2015 at 8:46 Mosh Feu asked Dec 17, 2015 at 8:03 Mosh FeuMosh Feu 29.3k18 gold badges93 silver badges141 bronze badges 8Unknown provider: ui-gridProvider <- ui-grid
http://errors.angularjs/1.2.26/$injector/unpr?p0=ui-gridProvider%20%3C-%20ui-grid
- Duplicate of stackoverflow./q/13724832 ? – A T Commented Dec 17, 2015 at 8:22
-
@AT no it's not. My question is about using another module and his directives in the
view
not in thecontroller
. – Mosh Feu Commented Dec 17, 2015 at 8:26 - I assume also a dupe of stackoverflow./questions/29617903/… & stackoverflow./questions/27721530/…. In Mosh’s case it’s a directive not a service – Anton Strogonoff Commented Dec 17, 2015 at 8:36
-
@AntonStrogonoff No, it's not. Did you see my ment to A T? It's the same. I don't need to inject a
service
orfactory
. I need to inject a module. Can you share with me a working fiddle with solution like in your attached question? – Mosh Feu Commented Dec 17, 2015 at 8:39 - @MoshFeu I don’t think injector would help you with modules indeed, can’t help here. Note that in your second code block example you’re showing how you want to inject a directive, not a module. It’s in general confusing as to what is the goal that you’re trying to achieve. – Anton Strogonoff Commented Dec 17, 2015 at 8:53
5 Answers
Reset to default 5 +50Core Angular API does not provide this feature. ocLazyLoad is the popular library for lazy loading of modules and ponents in Angular.
You can find more info on their page: https://oclazyload.readme.io
or the GitHub repository: https://github./obe/ocLazyLoad
Core Angular API does provide this feature, simply use 'requires' property of module @ Properties section @ https://code.angularjs/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 is also good solution, but I guess 'requires' property will solve your problem without much effort.
In my project I dynamically bootstrap angular modules using angular.bootstrap()
. I have several pages with different sets of modules.
Example:
var app = angular.module('demo', [])
.controller('WeleController', function($scope) {
$scope.greeting = 'Wele!';
});
angular.bootstrap(document, ['demo']);
<script src="https://ajax.googleapis./ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-controller="WeleController">
{{greeting}}
</div>
$injector
is used to retrieve object instances as defined by provider, instantiate types, invoke methods, and load modules.
var $http = $injector.get('$http');
To plete your use-case:
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
}
});
For more information see:
- https://docs.angularjs/api/auto/service/$injector
- https://github./angular/angular.js/wiki/Understanding-Dependency-Injection
In a angularJS for injecting module you should inject it after your module name as you did.
But you have few steps to can use it:
Install it with this 2 way
npm
orbower
like below:npm install angular-ui-grid
bower install angular-ui-grid
Then add a
<script>
to your index.html:<link rel="stylesheet" type="text/css"href="/bower_ponents/angularui-grid/ui-grid.css" /> <script src="/bower_ponents/angular-ui-grid/ui-grid.js"></script>
- If you use
npm
, you should change the source path to/node_modules/
.
- If you use
After this steps each module you can have access to you module like below:
angular.module('my.module', ['ui.grid'])
.