2

我只是$transitions.onStart角UI路由器1.0.x的:event.preventDefault&event.defaultPrevented替代

$rootScope.$on('$stateChangeStart', function(e, ...){ 
    e.preventDefault(); 
    // other code goes here... 
}); 

取代$stateChangeStart

$transitions.onStart({}, function(tras){ 
    // need a code equivalent to e.preventDefault 
    // need a code to identify event.defaultPrevented 
    // other code goes here... 

    // get parent states 
    _o.util.getAncestorStates(toState.name, true).reverse() 
     .forEach(function (state) { 
      // certain condition to call event.preventDefault() 

      if(event.defaultPrevented) {....} 
    }); 
}); 

,我想,我們可以防止通過添加return $q.reject()而不是e.preventDefault(),但我不明白return $q.reject()以下的代碼將如何執行。

另外,如何更換event.defaultPrevented

我覺得應該在transition.promise上做一些事情,但不清楚。

對不起,我很難理解官方文檔 - https://ui-router.github.io/ng1/docs/latest/。任何人都可以幫我找到更好的解釋或替代上述代碼嗎?

+0

我想從'.onStart'你可以'返回FALSE'取消過渡.. – tanmay

+0

沒關係,我只是增加了更多的片段來了解爲什麼需要'event.defaultPrevented ' - 我處理所有父狀態,並且在某種情況下,我調用'event.preventDefault'並檢查'event.defaultPrevented'是否有其他父狀態。 – Garfield

+1

使用承諾鏈,如果先前的塊取消,則跳過隨後的「.then」塊中的代碼。如果前一個處理程序取消轉換,則不會調用「onStart」處理函數。 'event.defaultPrevented'永遠不會在'onStart'處理程序中成爲'true'。而是調用'onError'處理程序鏈,只有當'event.defaultPrevented'爲true時,纔會調用這些塊。 – georgeawg

回答

3

您可以選擇這兩個選項之一,取決於你的邏輯:

  • 由於角UI路由器1.0.3可以使用$transition.abort()。如果您在異步調用後必須中止狀態更改,請選擇更清晰的選項。

    $transitions.onStart({}, function($transition) { 
        $transition.abort(); 
        //more code... 
    }); 
    
  • 而且,@tanmay在評論中說,你可以用一個簡單的return false取消它。這也可用於非穩定版本(1.0.0.beta和1.0.0.rc)。 (Check it in ui-rooter docs

    $transitions.onStart({}, function($transition) { 
        //code ... 
        return false; 
    }); 
    
+1

我用'q.reject'使用了第二個點,它運行得很好 – Garfield