Структура angularjs + requirejs для создания огромного модульного приложения

Я пытаюсь создать огромное модульное веб-приложение с AngularJs и RequireJS. Это мой каталог, который я хочу построить:

|--index.html
|--css
|--images
|--libs
|  └--angular.js
|  └--angular-route.js
|  └--require.js
|
|--js
|  └--app.js
|  └--controller.js
|
└--module
   |--user
   |  |--controller
   |  |  └--index.js (that is controller to list all users)
   |  |  └--add.js (this controller to add new user)
   |  |--service
   |  |  └--user.js
   |  └--template
   |     └--index.tpl.html
   |     └--add.tpl.html
   |  
   └--photo  
      |--controller
      |  └--index.js
      |  └--add.js
      |--service
      |  └--photo.js
      └--template
         └--index.tpl.html
         └--add.tpl.html

В app.js

'use strict';
var hugeApp = angular.module('hugeApp', [
    'ngRoute',
    'mainController'
]);

hugeApp.config(['$routeProvider', function($routeProvider) {
    $routeProvider.
        when('/:fullpath', {
            templateUrl: 'main.html',
            controller: 'RouteController'
        }).
        otherwise({
            templateUrl: 'main.html',
            controller: 'RouteController'
        });
}]);

И для controller.js

'use strict';

var mainController = angular.module('mainController', []);

mainController.controller('RouteController', ['$scope', '$routeParams', function($scope, $routeParams) {
    // I will use url link to find the right sub-controller
    // example:
    //   #/user:index
    //   #/user:add

   /* This is Some code to find moduleId and ControllerId */

   var moduleId = 'user';
   var controllerId = 'index';

   //  This is the code by using requireJS to replace
   //  controller to /module/user/controller/index.js
   //  and view to /module/user/template/index.html
}]);

Теперь я хочу завершить код для замены контроллера и просмотра выше с RequireJs. Как я могу сделать это?

1 ответ

Использование RequireJS и AngularJS, к сожалению, не просто. Основной принцип заключается в том, что вам нужно кэшировать провайдера во время инициализации и использовать его для создания контроллера в модулях RequireJS. Вот как выглядит инициализация:

var app = angular.module('webapp', ['ngRoute']);

app.config(['$controllerProvider', '$compileProvider', '$filterProvider', '$provide',
    function ($controllerProvider, $compileProvider, $filterProvider, $provide) {
        app.register =
        {
            controller: $controllerProvider.register,
            directive: $compileProvider.directive,
            filter: $filterProvider.register,
            factory: $provide.factory,
            service: $provide.service
        };
    }
);

Вот сообщение в блоге от Дэна Уолина, в котором подробно объясняется механизм:

AngularJS 2.0 также пообещал решить эту проблему, используя синтаксис ES6. Вы можете найти больше информации об этом здесь:

Если вам что-то нужно немедленно, я создал следующее для удовлетворения моих потребностей:

Другие вопросы по тегам