如何将RequireJS模块集成到AngularJS应用程序中?

时间:2015-05-16 17:56:38

标签: javascript angularjs architecture requirejs

我想将RequireJS模块集成到AngularJS应用程序中。您可以在下面看到示例代码。如何从Module中的module.js加载app.js

编辑:查看this solution我自己发布了一个答案。你有什么评论吗?



// module.js
define('Module', [], function() {
  return {
    init: function() {
      console.log("Module created!");
    }
  };
});

// app.js
var app = angular.module('app', []);

app.controller('MainCtrl', function($scope) {
  // I want Module to be available here
  $scope.data = 'app';
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.17/require.min.js"></script>
<script src="https://code.angularjs.org/1.4.0-rc.2/angular.js"></script>

<body ng-controller="MainCtrl" ng-app="app">
  <div ng-bind="data"></div>
</body>
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:1)

由于app.js只是一个javscript文件,你可以使用

require(['Module'], function(Module) {
     Module.init();
})

把它变成一种混合应用程序?

答案 1 :(得分:1)

以下是如何将RequireJS模块和AngularJS模块系统结合使用。

我已将每个AngularJS组件保存在单独的require模块中,以便您可以在需要时加载它。因为需要依赖性,RequireJS将确保加载当前角度模块中所需的所有其他角度模块。

utils.getDeps将使用requireJS依赖项自动为当前角度模块创建角度模块依赖项数组。

define('listModule', ['angular', 'jquery', 'utils', 'service'], function(ng, $, utils){
    var moduleInfo = {
        moduleName: 'listModule',
        deps: utils.getDeps(arguments)
    };
    
    angular.module(moduleInfo.moduleName, moduleInfo.deps)
      .directive('list', function (){
          return {
              restrict: 'E',
              template: '<div> <ul> <li ng-repeat="item in slist"> {{ item.name }} - {{ item.car }} </li> </ul> </div>',
              controller: function($scope, service){
                  $scope.slist = service.getCustomers();
              }
          }
      });
    
    return moduleInfo;
});

define('service', ['angular', 'jquery', 'utils'], function(ng, $, utils){
    var moduleInfo = {
        moduleName: 'serviceModule',
        deps: utils.getDeps(arguments)
    };
    
    angular.module(moduleInfo.moduleName, moduleInfo.deps)
      .service('service', function (){
          this.getCustomers =  function (){
              return [
                  {
                      name: 'Jack',
                      car: 'Audi'
                  },
                  {
                      name: 'Rekha',
                      car: 'Mercedes'
                  }
              ];
          };
      });
    
    return moduleInfo;
});

define('utils', ['jquery'], function($){
    var obj = {};
    obj.getDeps = function(args){
        return  $.map(args, function (e) {
             return e && e.moduleName;
        });
    };
    return obj;
});

require.config({
    paths: {
        'jquery': 'https://code.jquery.com/jquery-1.11.3.min',
        'angular': 'https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min'
    },
    shim: {
        'angular': { exports: 'angular', deps: [ 'jquery' ] },
        'jquery': { exports: 'jquery' }
    }
});

require(['angular', 'jquery', 'utils', 'listModule', 'service'], function (angular, $, utils) {
    angular.module('mainApp', utils.getDeps(arguments));
    angular.element(document).ready(function() {
      angular.bootstrap($('#main'), ['mainApp']);
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.17/require.min.js"></script>

<div id="main">
    <list></list>
</div>

答案 2 :(得分:0)

目前我的解决方案是在加载所需模块后手动引导应用程序。

// module.js
define('Module', [], function() {
  return {
    init: function(elm, data) {
      elm.innerHTML = JSON.stringify(data);
    }
  };
});

// app.js
// let it be Require app
require(['Module'], function(Module) {
  
  var app = angular.module('app', []);

  app.directive('module', function() {
    return {
      scope: {
        data: '=data'
      },
      link: function(scope, elm, attr) {      
        Module.init(elm[0], scope.data);      
      }
    }
  });

  app.controller('MainCtrl', function($scope) {
    $scope.data = {
      type: 'block'
    };
  });

  // manlually initialize
  angular.element(document).ready(function() {
    angular.bootstrap(document, ['app']);
  });
    
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.17/require.min.js"></script>
<script src="https://code.angularjs.org/1.4.0-rc.2/angular.js"></script>

<body ng-controller="MainCtrl">
  <module data="data"/>
</body>