2014-04-10 16 views
5

Độ dốc lên trên gócui-router

Và phải vật lộn với chuyển hướng đến một trạng thái khác nhau nếu một điều kiện tiên quyết không được đáp ứng:

tôi đã cố gắng sử dụng một kẻ đánh chặn: (How do I preform a redirect in an angular interceptor).

Nhưng ai đó đã đề cập rằng việc xử lý $ stateChangeState sẽ phù hợp hơn. Nhưng tôi vẫn đang chạy vào một vòng lặp vô hạn:

/** 
    * Check here for preconditions of state transitions 
    */ 
    $rootScope.$on('$stateChangeStart', function(event, toState) { 

     // which states in accounts to be selected 
     var accountRequiredStates = ['user.list', 'user.new']; 
     if(_.contains(accountRequiredStates, toState.name)){ 
      event.preventDefault(); 
      ApiAccount.customGET('get_current').then(function(resp){ 
       // if I have a selected account, go about your business 
       if(resp.hasOwnProperty('id')){ 
        $state.go(toState.name); 
       } else { // prompt user to select account 
        $state.go('user.select_account'); 
       } 
      }) 
     } 
    }); 

bất cứ ai có thể đề xuất một mô hình tốt hơn (một trong những hoạt)

Cảm ơn!


Lưu ý: Tương tự như vấn đề tiếp cận khác ở đây: How do I preform a redirect in an angular interceptor

+0

bạn chỉ nên ngăn sự kiện nếu bạn muốn chuyển hướng. Tôi đoán '$ state.go' phải được đưa vào hàm' $ timeout'. – zeroflagL

+0

cảm ơn - bạn có thể chia sẻ mã snipit không? – Jonathan

+0

Tôi nghĩ câu hỏi của bạn là duplciate với http://stackoverflow.com/questions/21631896/why-does-this-angular-ui-router-code-cause-an-infinite-loop-in-digest – linkary

Trả lời

1

Tôi không nghĩ rằng có điều gì sai trái với cách nói chung bạn đang cố gắng để làm điều này, mặc dù tôi không phải là một chuyên gia. Tôi thấy một lỗ hổng trong việc thực hiện có vẻ như nó có thể gây ra một vòng lặp vô hạn. Giả sử người dùng cố gắng truy cập trạng thái 'user.new'. Trình lắng nghe $ stateChangeStart của bạn chặn, hủy bỏ nó, tùy chỉnh của bạn; sau đó nếu điều kiện bên trong nếu đúng (resp.hasOwnProperty('id')), bạn cố gắng gửi người dùng đến cùng trạng thái 'user.new'. Tại thời điểm đó, trình lắng nghe $ stateChangeStart của bạn chặn nó, hủy bỏ nó, vv, hơn và hơn.

Con đường tôi tránh vấn đề này trong mã của tôi là phải có một biến (trong dịch vụ mà tôi tuyên bố người nghe) để giúp tôi bỏ qua đó kiểm tra: var middleOfRedirecting = false; Bên trong nội tâm của bạn nếu khối trong việc kiểm tra resp.hasOwnProperty('id'), thiết middleOfRedirecting để thật; thêm điều kiện khi bắt đầu trình lắng nghe $ stateChangeStart của bạn để chỉ gọi event.preventDefault() và chuyển hướng nếu chuyển giữa middleOfRedirecting là sai. Bạn cũng sẽ cần một trình lắng nghe $ stateChangeSuccess để đặt middleOfRedirecting trở về false, đặt lại nó cho thay đổi trạng thái tiếp theo. (Tôi cảm thấy như có cách nào tốt hơn thế này, nhưng ít nhất cũng có tác dụng.)

Các vấn đề liên quan