2014-12-02 20 views
4

我的視圖自動重定向到默認(否則)視圖,我不知道爲什麼。當我點擊時,它從查看1查看2然後自動重定向到默認查看3。我在視圖2角度視圖自動重定向到默認(否則)視圖

檢查通過將 console.log()視圖1 - >視圖2 - >VIEW3

myApp.config(function ($stateProvider, $urlRouterProvider) { 
    $stateProvider 
     .state('view1', { 
      url: "/view1", 
      templateUrl: "App/Views/start/view1.html", 
      controller: 'MyController' 
     }) 
     .state('view2', { 
      url: "/view2/:details", 
      templateUrl: "App/Views/start/view2.html", 
      controller: 'MyController' 
     }); 
    $urlRouterProvider.otherwise('/view3'); 
    }); 

我打電話來$state.go這樣。

$state.go('view2', { details: JSON.stringify(response.details) }); 

我試圖通過防止在$stateChangeStart默認攔截,但遇到了一個錯誤:達到

$摘要()迭代。中止

所解釋here這是由於$urlRouterProvider$stateProvider之間的相互作用問題。但即使我成功攔截它,我也不確定這是否正確。那麼究竟是什麼造成了它?或者我怎樣才能找出導致重定向的原因。順便說一句,我已經檢查了$stateChangeError,沒有。

myApp.controller('MyController', ['$scope', '$stateParams', '$state', function ($scope, $stateParams, $state) { 
$scope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) { 
    if (toState.name == "view3" && fromState.name == "view2") { 
     event.preventDefault(); 
    } 
}); 
}); 
+0

如果您發佈了顯示問題原因的「tab.congratulations」的內容,這將非常有用。 – ProLoser 2014-12-05 21:25:37

+0

我認爲問題的原因是HTML,可以請您分享html代碼 – harishr 2014-12-06 05:49:12

+0

我很確定,那裏不是HTML,因爲我也測試了一個空模板,它的表現方式也一樣。我嚴重懷疑它是否與路由參數有關。同樣抱歉的差異,我改變了所有的視圖名稱,在這裏通用和忘了改變一個。我已經編輯了這些差異。 – 2014-12-06 21:38:05

回答

4

我認爲你的response.details有非網址編碼字符,使路線提供者認爲你正在導航到更深的頁面,即var response = {details:'bar/foo'};實際上將導航到/view2/bar/foo觸發你的,否則。

+0

那麼,這是有道理的,但我串起了響應,這不會有幫助嗎?它也是從view1 - > view2 - 自動重定向 - > view3。它不會跳過view2,但我會嘗試再次跳出字符串。 – 2014-12-09 05:16:31

+0

我認爲你是對的。我只測試了編碼字符串,它在一種情況下工作。讓我測試一些更多的案例,我會標記你的答案是正確的。 – 2014-12-09 06:23:06

+0

$ state.go構建URL以交給Angular的路由。所以任何帶有'/'或'?'的東西或'&'可能會造成垃圾。不確定JSON字符。理想情況下,參數是簡單的字符串或數字。你在做什麼想要以這種方式傳遞數據? – Scottux 2014-12-09 18:00:11

1

這是一種在黑暗中拍攝的照片,但請嘗試將$ urlRouterProvider放在$ stateProvider之前。我認爲可能發生的事情是,$ urlRouterProvider.otherwise()作爲一個捕獲所有的監視器,但到了它的範圍內時,所有的路由都已經運行完畢。這意味着即使$ stateProvider工作並向正確的URL發送請求,$ urlRouterProvider.otherwise()也會捕獲請求,就好像沒有發生一樣,並將它發送到默認頁面。

+0

非常感謝我的實現出了什麼問題!保持良好的工作! :D – saNiks 2016-04-07 01:19:24

1

如果我理解你的問題,你想知道在哪裏調試第一。我建議爲你的response.details添加一個console.log,因爲你沒有在你的問題中提供這個。

我不相信這是您的定義中的操作問題的順序,因爲您說這是在點擊時發生,當您調用$ state.go()。在你這樣做的時刻,路由器將嘗試查找並質量你所請求的狀態。由於你的狀態有一個URL,它也會嘗試使用你提供的參數將用戶發送到該URL。

由於您在這一點上發生故障,最合理的解釋是您的目標路由無法訪問,或者路由器認爲它不可訪問。由於你的路由包含一個參數,這很可能意味着路由器不接受你的參數 - 這個路徑被設置爲需要該參數,所以如果它不在那裏(或沒有通過驗證),你將觸發。除此以外()。

只需從state2的URL中刪除參數,就可以輕鬆排除此問題。當然你需要它,但是如果移除它可以讓你達到狀態,那麼它就是參數。如果刪除它仍然不能讓你到達那裏,那是另一回事,你需要在$ state.go()調用中設置一個斷點並追蹤它拒絕你的位置。確保在做這件事時使用未縮小的文件。

+0

嗨乍得,只是想澄清,它不是失敗,但自動立即從第二到第三視圖重定向。我已經成功地通過angular提供的各種stateChange事件來檢查此事件。另外,我在view2上放了一個console.log,它被記錄下來了,所以它被稱爲 – 2014-12-09 05:14:17

+0

和上面的@LokeshSuthar一樣。將數據字符串化並不一定會使URL安全。不跳過路由並不能告訴你很多 - $ stateChangeStart在狀態改變開始時被觸發。這並不意味着沒有問題。您仍然應該嘗試view2,而不需要URL中的任何參數。此外,請確保您註冊$ stateChangeError的處理程序,該處理程序將觸發有關狀態更改問題的詳細信息。 – 2014-12-09 06:02:09

+0

乍得我沒有註冊該處理程序,但它什麼也沒有顯示,這就是爲什麼我稱它爲成功的重定向。 – 2014-12-09 06:06:39