Как сообщить angular, что контроллер добавлен? (загружается из отдельного файла)

У меня есть index.html основной файл и частичный view1.html, и я использую ng-route. Поэтому я хочу, чтобы контроллер view1.js загружался только при доступе к view1.html. Итак, я успешно загрузил файл, используя директиву resolve. Поскольку javascript загружается в фоновом режиме, angular начинает анализировать view1.html, и я получаю:

[ng:areq] Argument 'SimpleController2' is not a function, got undefined

Как мне сообщить angular, что был добавлен новый контроллер, и он должен анализировать view1.html только после применения контроллера.

Проверьте это

main.js

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

  demoApp.config(function ($routeProvider) {
    $routeProvider
        .when('/view1', {
            controller: 'SimpleController1',
            templateUrl: 'View1.html',
            resolve: {
                lol : function get() {
                    console.log('file is being loaded');
                    var fileRef = document.createElement('script');
                    fileRef.setAttribute("type", "text/javascript");
                    fileRef.setAttribute("src", "view1.js");
                    document.getElementsByTagName("head")[0].appendChild(fileRef);
                    fileRef.onload = function () {
                        console.log('file loaded');
                    }

                }
            }
        })
        .when('/view2',
        {
            controller: 'SimpleController',
            templateUrl: 'View2.html'
        })
        .otherwise({redirectTo: '/view1'});
});

console.log('config has been added');

controller.js

console.log("file parsed");
demoApp.filter('myFilter', function ($sce) {

    return function (input, isRaw) {
        input = input.replace(/a/g, 'b');
        return $sce.trustAsHtml(input);
    };

});

demoApp.controller("SimpleController1", function ($scope, simpleFactory) {
    $scope.names = [

        {name: 'Nick', city: 'London'},
        {name: 'Sick', city: 'Tokio'},
        {name: 'Brick', city: 'cellar'}
    ];
});

Я новичок в angular. Я пробовал это, это (как применять файлы) и this (отказался от применения $controllerProvider) это (тоже не удалось) и это (не удалось заставить все это работать вместе) Я даже не уверен, что они описали мои потребности. Пожалуйста, дайте мне подсказку, какой пост я должен копнуть глубже.


person deathangel908    schedule 06.10.2015    source источник
comment
Для этого нужно использовать сторонний загрузчик. Есть ли причина, по которой вы чувствуете, что вам нужна ленивая загрузка, как сейчас?   -  person charlietfl    schedule 07.10.2015
comment
Нравится $controllerProvider ? У меня есть 3 представления, и каждое из них имеет более 1000 строк кода, я не хочу загружать их в глобальном масштабе. Еще минус в том, что я не хочу, чтобы у main.js был смешанный код из представлений. Я хочу, чтобы это было ясно и читабельно. У меня плохо спроектированная архитектура? Должен ли я реализовывать контроллеры только в main.js и внедрять функции, которые они используют, в отдельные файлы?   -  person deathangel908    schedule 07.10.2015
comment
Если вас беспокоит только загрязнение глобальной области видимости, вы можете получить ссылку на свой угловой модуль, используя angular.module('demoApp') (без второго аргумента).   -  person yvesmancera    schedule 07.10.2015
comment
Также наличие более 1000 строк кода в контроллере может быть признаком того, что вы не используете службы, фабрики или директивы Angular.   -  person yvesmancera    schedule 07.10.2015


Ответы (1)


Вы не можете проверить существование контроллера без пробного запуска с помощью $controller и перехвата исключения, что ужасно.

Даже тогда вам будет сложно зарегистрировать новый контроллер, потому что после фазы конфигурации app.controller нельзя использовать, а $controllerProvider.register доступен только в блоках конфигурации.

Вы можете просмотреть существующие решения для отложенной загрузки, например ocLazyLoad. вот как он управляет маршрутами.

person Estus Flask    schedule 07.10.2015