Как исправить AngularJS с проблемой RequireJS racing

#javascript #angularjs #requirejs

#javascript #angularjs #requirejs

Вопрос:

Я использую requirejs с angularjs, и у меня возникает какая-то проблема с гонками, когда страница будет отлично загружаться примерно 9/10 раз, но в другой раз будет выбрасываться неопределенный объект. Вот оскорбительный код.

 define("app", ["angular", "angular-resource", "angular-route", "components/app/app-ctrl"], function (angular) {  
    var app = angular.module("app", [
        "ngResource", 
        "ngRoute", 
        "app.myApp2",
        "app.myApp3"
    ]).config(["$routeProvider", function ($routeProvider) {
        $routeProvider.when("/", {
            controller: "appCtrl2", 
            templateUrl: "/app/partials/first.html"
        }).when("/dashboard", {
            controller: "appCtrl3", 
            templateUrl: "/app/partials/second.html"
        }).
        otherwise({redirectTo: '/'});
    }]);

    angular.element().ready(function() {
        angular.bootstrap(document, ["app"]);
    });

    return app;
});
  

Теперь я знаю, что если я уберу модули MyApp2, myApp3 из области загрузки приложения, ошибка исчезнет. Однако, если я оставлю это там, ошибка возникает в коде angular.boostrap. Я думаю, это можно было бы исправить, если бы я мог переместить загрузку компонентов MyApp2, myApp3 вниз, чтобы быть после начальной загрузки. Вместе с конфигурацией. Возможно ли это? Имейте в виду, что мне все еще нужно вернуть приложение, чтобы другие модули requirejs могли его использовать.

Ответ №1:

Я исправил эту проблему, добавив оператор require вокруг начальной загрузки, который требует, чтобы все компоненты, которые необходимо загрузить до начальной загрузки. На случай, если это кому-нибудь поможет при использовании RequireJS с Angular.

 define("app", ["angular", "require", "angular-resource", "angular-route", "components/app/app-ctrl"], function (angular, require) {  
    var app = angular.module("app", [
        "ngResource", 
        "ngRoute", 
        "app.myApp2",
        "app.myApp3"
    ]).config(["$routeProvider", function ($routeProvider) {
        $routeProvider.when("/", {
            controller: "appCtrl2", 
            templateUrl: "/app/partials/first.html"
        }).when("/dashboard", {
            controller: "appCtrl3", 
            templateUrl: "/app/partials/second.html"
        }).
        otherwise({redirectTo: '/'});
    }]);

    angular.element().ready(function() {
        require(["myApp2", "myApp3"], function() {
            angular.bootstrap(document, ["app"]);
        });
    });

    return app;
});