2015-02-06 113 views
5

这是我主要的应用程序(app.js)角JS - UI路由器页面重载不会将状态

(function(ng, module) { 
    module.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider){ 

     $urlRouterProvider.otherwise("app"); 

     $stateProvider.state('login', { 
      url: 'login', 
      templateUrl: '/assets/templates/pages/login.html' 
     }).state('root', { 
      url: '', 
      templateUrl: '/assets/templates/pages/index.html' 
     }); 


    }]); 
}) (angular, angular.module('myapp', ['ui.router', 'myapp.submodule'])); 

这是子模块(submodule.js)

(function(ng, module) { 
    module.config(['$stateProvider', function($stateProvider){ 
     $stateProvider.state('root.substate', { 
      url: 'todo/{type}', 
      templateUrl: '/assets/app/todo/todo.html', 
      controller: function($stateParams, $scope) { 
       // Do stuff. 
      } 
     }); 
    }]); 

}) (angular, angular.module('myapp.submodule', ['ui.router'])); 

的预期的行为是

  • 重定向到“应用程序”链接时,没有匹配的路由发现
  • 激活在根URL
  • “根” 的状态激活/ TODO网址

这是工作罚款 “root.substate” 状态。

但是,如果我刷新页面,状态不会被激活,我会被发送回“应用程序”。为什么?

+1

也许不是真正的问题

angular.module('app').run(['$state', '$stateParams', function($state, $stateParams) { //this solves page refresh and getting back to state }]); 

喜欢提到here,但我会**肯定* *用'/' - 'url:'/ todo/{type}''开始任何网址'' – 2015-02-06 13:34:46

+0

我仍在测试,但似乎主要的斜线可能是问题。 – brazorf 2015-02-06 14:37:09

+0

你知道为什么吗?简单地说,必须有一些方法来清楚地定义状态URL的起始位置。你的url映射表明:'domain/applogin'实际上......并且我建议:'domain/app/login'。所以没有斜线...发动机的大问题,如果你知道我的意思 – 2015-02-06 14:38:15

回答

6

我们有两个(没有父母)州。这些应该是有没有 URL,或者它应该有一些独特的标志开始 - 最好的选择总是会与(URI规范)是/

// domain/app/login - easy to find 
.state('login', { 
    url: 'login', 
    ... 
}) 
// no def === domain/app 
.state('root', { 
    url: '', 
    ... 
}); 

现在,让我们用一些url甚至我们'root'状态:

// domain/app/ 
.state('root', { 
    url: '/', 
    ... 
}); 

那芒,我们的孩子root.substate'也将包含父url部分。因此,如果我们将利用这一

// this is a child and its url will be in fact: domain/app//todo/sometype 
.state('root.substate', { 
    url: '/todo/{type}', 
    ... 
}); 

看到的,这样一来,我们的网址将现在的孩子包含//(双斜线)

为了避免这种情况,我们可以使用UI-路由器功能“^”

// this stat will not use the parent part 
// this will work domain/app/todo/sometype 
.state('root.substate', { 
    url: '^/todo/{type}', 
    ... 
}); 

检查文档:

Absolute Routes (^)

如果你想拥有绝对url匹配,那么你需要在你的url字符串前加一个特殊符号'^'。

$stateProvider 
    .state('contacts', { 
    url: '/contacts', 
    ... 
    }) 
    .state('contacts.list', { 
    url: '^/list', 
    ... 
    }); 
+0

谢谢,这是我正在寻找的答案 – brazorf 2015-02-06 14:50:25

+0

伟大的,如果这有帮助无论如何。享受强大的UI路由器;) – 2015-02-06 14:50:42

+1

我试过这个解决方案,它的工作原理。但我仍然有问题刷新页面导致默认路由(否则$) – 2015-08-24 17:41:29

0

我知道有很多的剩余时间。但关于清爽的问题。如果你想留在同一个URL地址刷新前你应该增加未来:在预最终答案