仅在需要AngularJS时才注入模块依赖项(如插件)

时间:2015-12-17 08:03:40

标签: javascript html angularjs angular-ui-grid angularjs-injector

我有2页(我不会使用angular' s 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>
&#13;
&#13;
&#13;

我的问题是,是否有办法在任何情况下都不会向应用程序注入ui-grid依赖项,但仅限于我需要时。

类似的东西:

app.controller('mainCtrl', function($scope) {
   app.$inject('ui-grid');
});

更新

我试着这样做:

var ui_grid = $injector.get('ui-grid');

但我有一个错误:

  

未知提供者:ui-gridProvider&lt; - ui-grid

     

http://errors.angularjs.org/1.2.26/$injector/unpr?p0=ui-gridProvider%20%3C-%20ui-grid

5 个答案:

答案 0 :(得分:5)

Core Angular API不提供此功能。 ocLazyLoad是Angular中延迟加载模块和组件的流行库。

您可以在其页面上找到更多信息: https://oclazyload.readme.io

或GitHub存储库: https://github.com/ocombe/ocLazyLoad

答案 1 :(得分:2)

Core Angular API提供此功能,只需使用module @ Properties部分@ https://code.angularjs.org/1.4.7/docs/api/ng/type/angular.Module

的'requires'属性
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也是很好的解决方案,但我认为“需要”属性可以毫不费力地解决您的问题。

答案 2 :(得分:1)

在我的项目中,我使用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>

答案 3 :(得分:0)

  

var $http = $injector.get('$http'); 用于检索由provider,实例化类型,调用方法和加载模块定义的对象实例。

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
    }
});

完成您的用例:

book.Categories

有关详细信息,请参阅:

答案 4 :(得分:0)

在angularJS for injectioning模块中,你应该按照你的模块名称注入它。

但是你几乎没有步骤可以使用它:

  1. 使用此方式npmbower安装,如下所示:

    npm install angular-ui-grid

    bower install angular-ui-grid

  2. 然后在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/
  3. 完成此步骤后,您可以访问模块,如下所示:

    angular.module('my.module', ['ui.grid'])