Angularjs 表单提交后未定义控制器:参数';注册控制器';不是函数,未定义

Angularjs 表单提交后未定义控制器:参数';注册控制器';不是函数,未定义,angularjs,Angularjs,我在应用程序配置文件中编写了一些自定义路由,以处理所有html模板和控制器的路由,而不必为每个html和控制器专门定义路由。我在Modules/Account/directory下有一个Registration.html和RegistrationController.js。我的应用程序可以在我第一次访问它时找到控制器,我可以填写页面并在页面上提交表单。成功提交后,我会被重定向到成功页面。当我第二次尝试返回到同一个注册html/控制器时,它可以找到我的html模板,但它再也找不到我的控制器,我得到

我在应用程序配置文件中编写了一些自定义路由,以处理所有html模板和控制器的路由,而不必为每个html和控制器专门定义路由。我在Modules/Account/directory下有一个Registration.html和RegistrationController.js。我的应用程序可以在我第一次访问它时找到控制器,我可以填写页面并在页面上提交表单。成功提交后,我会被重定向到成功页面。当我第二次尝试返回到同一个注册html/控制器时,它可以找到我的html模板,但它再也找不到我的控制器,我得到错误“参数'RegistrationController'不是函数,未定义”。有人能告诉我为什么以及如何解决这个问题吗

请注意,此错误仅在表单提交后发生。如果我离开页面并返回页面而不进行表单提交,则一切正常

应用程序配置

define(['angularAMD', 'angular-route', 'ui-bootstrap', 'ui-grid'], function (angularAMD) {
var app = angular.module("MyApp", ['ngRoute', 'ui.bootstrap', 'ui.grid']);

app.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) {
    $routeProvider
    .when("/", angularAMD.route({
        templateUrl: function (rp) { return 'Modules/Account/login.html'; },
        controllerUrl: 'Modules/Account/LoginController'
    }))
    .when("/:module/:page", angularAMD.route({
        templateUrl: function (rp) { return 'Modules/' + rp.module + '/' + rp.page + '.html'; },
        resolve: {
            load: ['$q', '$rootScope', '$location', function ($q, $rootScope, $location) {
                var path = $location.path();
                var parsePath = path.split('/');
                var parentPath = parsePath[1];
                var controllerName = parsePath[2];

                var loadController = "Modules/" + parentPath + "/" + controllerName + "Controller";
                debugger;
                var deferred = $q.defer();

                require([loadController], function () {
                    $rootScope.$apply(function () {
                        deferred.resolve();
                    });
                });

                return deferred.promise;
            }]
        }
    }))
    .otherwise({ redirectTo: '/' });
}]);

loadDirectives(app);
angularAMD.bootstrap(app);

return app;
});
注册控制器

define(['app-config','accountService'], function (app) {
app.register.controller('RegistrationController', ['$scope', '$rootScope', '$location', '$uibModal', 'accountService',
    function ($scope, $rootScope, $location, $uibModal, accountService) {
        $rootScope.applicationModule = "Account";

        $scope.registerUserSuccess = function (response, status) {
            debugger;
            $location.path("/Account/RegistrationSuccess");
        }

        $scope.registerUserFailure = function (response, status) {
            if (!response.ValidationErrors) {
                $scope.ErrorList = [];
                $scope.ErrorList.push("An error occurred. Please contact the system's administrator");
            }
            else {
                $scope.ErrorList = response.ValidationErrors;
            }
        }

        $scope.onSubmitClick = function (isValid) {
            if (isValid) {
                accountService.registerUser($scope.regModel, $scope.registerUserSuccess, $scope.registerUserFailure);
            }
        }

        $scope.onCancelClick = function () {
            $location.path("/Login");
        }
    }
]);
});

我还没有找到答案,但我注意到你应该做一些重构,这可能会让你更接近于解决你的问题

  • 停止使用控制器。使用1.5中介绍的组件。它们在可重用性方面具有优越性。它们在如何使用它们以及传递给它们的内容方面更加灵活。您应该使用的唯一控制器是组件中的控制器

  • 停止对任何内容使用$scope或$rootScope。使用命名控制器。这是组件的默认设置

  • 考虑角度路由上的ui路由器。只是好多了

  • LoadDirections(应用程序)在做什么

  • 在RegistrationContoller.js中放入一条log语句,并验证它没有被多次调用。如果它认为RegistrationController在之前被定义之后是未定义的,它只是感觉它被定义了不止一次

  • accountService.registerUser中是否有可疑信息?此功能是否将您转发到成功屏幕?这有点奇怪。。。在我看来,accountService.registerUser应该返回一个承诺,onSubmitClick应该解析该承诺并转发给用户

  • 尝试在代码中的不同点转发回RegistrationController,并尝试缩小未定义的确切点。我认为你有一些代码在某处运行,而你认为你没有


  • 您的问题没有RegistrationController代码我认为没有必要发布它,因为RegistrationController没有问题。如果我在routerprovider中为控制器添加了一个特定的定义,那么它每次都会找到控制器,并且一切都会正常工作。我的问题是我上面写的自定义路由第二次找不到我的控制器。它只能在我第一次访问控制器时找到。不,问题出在你的控制器上。我用控制器更新了我的问题。我使用requireJS进行延迟加载。你是对的。我有一个重复的注册控制器。根据#6,我实际上将$scope.Error函数从我的控制器传递给我的accountService,以便accountService.registerUser.then()调用它并通过$rootScope处理我的loadmasking。现在重构$scope和$rootScope对我来说有点困难,因为我在保存和加载html表单时使用它进行加载屏蔽。再次感谢你的帮助!