表单提交后控制器未定义:参数'RegistrationController'不是函数,未定义

时间:2017-02-02 17:27:48

标签: angularjs

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

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

App Config

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;
});

这个RegistrationController

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 个答案:

答案 0 :(得分:0)

我还没有得到答案,但是我注意到你应该做的一些重构可能会让你更接近找出你的问题...

  1. 停止使用控制器。使用1.5中引入的组件。它们的可重用性优越。它们在如何使用它们以及可以传递给它们的方式方面更灵活。您应该使用的唯一控制器是组件中的控制器。

  2. 停止使用$ scope或$ rootScope进行任何操作。使用命名控制器。这是组件的默认设置。

  3. 考虑ui-router over angular-route。它好多了。

  4. loadDirectives(app)在做什么?

  5. 在RegistrationContoller.js中添加一条日志语句,并确认它不会被多次调用。如果它认为RegistrationController在之前被定义之后是未定义的,那么感觉它被定义不止一次。

  6. accountService.registerUser中有什么可疑的吗?此功能是否将您转发到成功屏幕?那种奇怪的......在我看来,accountService.registerUser应该返回一个promise,onSubmitClick应该解析promise并转发用户。

  7. 尝试在代码中的不同位置转发回RegistrationController,并尝试缩小它未定义的确切点。我认为你有一些代码运行在你不认为你做的地方。