2013-02-15 68 views
14

希望不工作的routeChangeStart任何angularjs大師可以幫我this.Here是我angularjs代碼event.preventDefault()在angularjs應用

$scope.$on('$routeChangeStart', function(event, next, current) { 
       if ($scope.myForm.$dirty) { 
        if(!confirm("Unsaved, do u want to continue?")) { 
         event.preventDefault(); 
        } 
       } 
      }); 

它提醒在瀏覽器後退按鈕的點擊,當數據是髒的,但點擊取消或確定它仍然完成路線change.Seems像event.preventDefault()不起作用。 任何一個可以指出什麼可能是錯誤的

+0

大概檢查:HTTP://計算器。com/questions/14900008/prevent-redirect-behavior-in-angularjs-app – 2013-02-15 22:01:56

+0

@Flek但是該解決方案不會提示用戶進行確認,而只是不允許瀏覽返回按鈕來工作 – iJade 2013-02-16 06:58:06

+0

我遇到了同樣的問題。我已經嘗試了$ routeChangeStart和$ locationChangeStart,但都沒有工作。你有沒有找到適合這個問題的解決方案? – Sam 2013-04-25 17:53:33

回答

3

按照AngularJS docs(見$廣播)你根本不能取消類型的廣播事件($routeChangeStart是該類型的):

事件生命週期開始於$ broadcast被調用的範圍上,即 。在此範圍內偵聽名稱事件的所有偵聽器都會通知 。之後,該事件傳播到當前範圍的所有直接和間接範圍,並調用沿着 方式的所有註冊偵聽器。該活動無法取消。

+0

好吧所以dere任何其他方式來檢測瀏覽器後退按鈕點擊以外的使用$ routeChangeStart.I已經嘗試了locationChangeStart和onbeforeunload,兩者都不起作用 – iJade 2013-02-15 13:34:23

+0

我會首先調用一個函數來檢查所有的依賴關係,並且只有在它們爲真的情況下才會更改位置。關於你實際嘗試做什麼的更多細節會很好。 – 2013-02-15 13:52:19

+0

好吧,其實我有一個form.If表單有未保存的數據,用戶點擊瀏覽器後退按鈕,它會要求一個確認message.This是我真正想做的。這將是幫助完整,如果你可以發佈一些代碼。 – iJade 2013-02-15 13:54:44

32

我有很多的麻煩找到這一個,但代替「$ routeChangeStart」事件,您可以收聽到「$ locationChangeStart」事件,以便您可以防止默認:

$scope.$on("$locationChangeStart", function(event, next, current) { 
    if (!confirm("You have unsaved changes, continue navigating to " + next + " ?")) { 
     event.preventDefault(); 
    } 
}); 

您也可以始終防止默認值,存儲「下一個」,並顯示一個乾淨的JS模式並異步決定。

$ locationChangeStart目前無證,但這裏提到:https://github.com/angular/angular.js/issues/2109

+0

它適合我! – RolandoCC 2014-04-04 20:14:51

+0

謝謝,謝謝,謝謝! – 2014-10-31 17:07:31

2

此問題已修復在最新版本(> = 1.3.8)。

由於供給$ routeChangeStart參數是更詳細的(並且經常更有用),如果可能的話,嘗試更新您的角版本...

5

角1.3.7 https://code.angularjs.org/1.3.7/docs/api/ngRoute/service/ $路線

後正好修​​正

$ routeChangeStart 在路由更改前廣播。此時,路由服務開始解決路由更改發生所需的所有依賴關係。通常這涉及獲取視圖模板以及解析路由屬性中定義的任何依賴關係。一旦所有的依賴關係解決了$ routeChangeSuccess被觸發。

通過調用事件的preventDefault方法可以防止路由更改(以及觸發它的$ location更改)。有關事件對象的更多詳細信息,請參閱$ rootScope.Scope。

0

如果您使用的是$stateProvider,則問題可能會持續存在。 在這種情況下使用:

$scope.$on('$stateChangeStart', function(event){ 
 
    ..... 
 
    event.preventDefault(); 
 
});

相關問題