2014-01-21 38 views
2

我使用AngularUI的路由器库,我有一个奇怪的问题:我有两个不同但相似的状态和控制器。发生什么是我期望运行的状态,但是另一个状态似乎运行:它取回模板UI,然后控制器运行第二个状态,这会导致一些奇怪的行为。角度ui.router执行多个状态

有问题的状态:

angular.module('app', ['ui.route']) 
.config(function ($urlRouterProvider, $stateProvider) { 
    $urlRouterProvider.otherwise("/"); 

    $stateProvider 
    .state('list', { 
     url: "/", 
     templateUrl: STATIC_URL + "js/eleagemot/views/list.html", 
     controller: 'questionListCtrl', 
    }) 
    .state('detail', { 
     url: '/{username:[a-zA-Z0-9\\-]+}/{slug:[a-z0-9\\-]+}/', 
     templateUrl: STATIC_URL + "js/eleagemot/views/detailed_question.html", 
     controller: 'questionDetailCtrl' 
    }) 
    .state('newQuestion', { 
     url: '/new-question/', 
     templateUrl: STATIC_URL + "js/eleagemot/views/edit_question.html", 
     controller: 'editQuestion' 
    }) 
    .state('questionEdit', { 
     url: '/{username:[a-zA-Z0-9\\-]+}/{slug:[a-z0-9\\-]+}/edit/', 
     templateUrl: STATIC_URL + "js/eleagemot/views/edit_question.html", 
     controller: 'editQuestion' 
    }) 
    .state('answerEdit', { 
     url: '/answer/{id:[0-9]+}/edit/', 
     templateUrl: STATIC_URL + "js/eleagemot/views/edit_answer.html", 
     controller: "editAnswer" 
    }) 
}); 

究竟会发生什么,如果是我去/answer/1/edit/它首先加载edit_answer.html模板和运行editAnswer控制器,因为它应该。但是,它也会加载edit_question.html模板并运行editQuestion控制器。我知道,因为有一些Restangular代码在editAnswer控制器中正确运行,然后在editQuestion控制器中运行一些类似的Restangular代码,但会导致404,然后路由器将重定向到根。同时在每个控制器的顶部放置一些控制台日志,可以看出editAnswer控制器正在运行,然后是editQuestion控制器。

此行为仅在加载answerEdit状态的url时出现,并且不适用于其他任何状态。为什么会发生这种情况,我该如何解决?

+0

您应该发布您的editAnswer控制器,以便我们也可以查看。这可能会导致问题。 –

回答

2

看起来你有一些正则表达式太容易匹配。请注意,/answer/{id:[0-9]+}/edit/总是与上面的网址格式匹配:'{username:[a-zA-Z0-9\\-]+}/{slug:[a-z0-9\\-]+}/edit/

+1

啊,谢谢。我在问题面前添加了“/问题”。 – cellofellow