2015-02-06 111 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地址刷新前你應該增加未來:在預最終答案