我在我的应用配置文件中编写了一些自定义路由来处理所有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");
}
}
]);
});
答案 0 :(得分:0)
我还没有得到答案,但是我注意到你应该做的一些重构可能会让你更接近找出你的问题...
停止使用控制器。使用1.5中引入的组件。它们的可重用性优越。它们在如何使用它们以及可以传递给它们的方式方面更灵活。您应该使用的唯一控制器是组件中的控制器。
停止使用$ scope或$ rootScope进行任何操作。使用命名控制器。这是组件的默认设置。
考虑ui-router over angular-route。它好多了。
loadDirectives(app)在做什么?
在RegistrationContoller.js中添加一条日志语句,并确认它不会被多次调用。如果它认为RegistrationController在之前被定义之后是未定义的,那么感觉它被定义不止一次。
accountService.registerUser中有什么可疑的吗?此功能是否将您转发到成功屏幕?那种奇怪的......在我看来,accountService.registerUser应该返回一个promise,onSubmitClick应该解析promise并转发用户。
尝试在代码中的不同位置转发回RegistrationController,并尝试缩小它未定义的确切点。我认为你有一些代码运行在你不认为你做的地方。