2016-08-11 21 views
12

Làm thế nào để thay thế lịch sử thay vì đẩy một lịch sử mới trong bộ định tuyến mới của góc 2 (rc.1)?Góc 2 - thay thế lịch sử thay vì đẩy

Ví dụ: Im trong danh sách câu hỏi (/questions) mở phương thức mới theo tuyến mới (/questions/add) và sau khi thêm câu hỏi mới, tôi chuyển đến giao diện câu hỏi (/questions/1). Nếu tôi nhấn trở lại Tôi muốn đi đến /questions thay vì /questions/add

+0

Bạn đã thử 'canDeactivate' bảo vệ cho tuyến đường của bạn '/ câu hỏi/1'? Chỉ cần kiểm tra đích mong muốn, nếu nó là '../add', chuyển hướng đến '/ questions'? Hoặc thực hiện 'canActivate' cho '../add' route thay thế .. –

+0

quá phức tạp. tôi có hàng trăm nơi mà tôi cần hành vi và bảo vệ này với các chuyển hướng chỉ là các bản vá lỗi khỉ sẽ tạo ra rất nhiều mã – pleerock

Trả lời

32

Nếu bạn sử dụng

router.navigate 

Và sau đó

location.replaceState 

Với cùng một đường dẫn chính xác, bạn có thể kích hoạt các thay đổi thường xảy ra, cũng như thay thế lịch sử.

Ví dụ, trong trường hợp của bạn:

this.router.navigate(['questions/1']); 
this.location.replaceState('questions/1'); 

Nếu bạn cần phải thêm tham số cho các tuyến đường, bạn có thể tạo ra các url đối với vị trí sử dụng

router.serializeUrl(router.createUrlTree(/* what you put in your router navigate call */)); 

Trong ví dụ của bạn:

this.router.navigate(['questions/1', {name:"test"}]); 
this.location.replaceState(this.router.serializeUrl(this.router.createUrlTree(['questions/1', {name:"test"}]))); 

Cập nhật

Có vẻ như bộ định tuyến góc bây giờ đi kèm với một replace url option. Trong ví dụ của bạn:

this.router.navigate(["questions/1"], {replaceUrl:true}); 

Cập nhật 2

Có một hiện issue nơi nhiều điều hướng thực hiện trong một khoảng thời gian ngắn có thể không thay thế các URL chính xác. Là một workaround tạm thời, quấn chức năng điều hướng trong một thời gian chờ để có được mỗi bắn trong một chu kỳ riêng biệt:

setTimeout(()=>{ 
    this.router.navigate(["questions/1"], {replaceUrl:true}); 
}); 
+0

khỏe. Cảm ơn – Mikel

+0

Lưu ý: Đối với chỉ thị [routerLink] (https://angular.io/api/router/RouterLink), bạn có thể thêm thuộc tính 'replaceUrl' vào phần tử cho cùng một hiệu ứng. – dokkaebi

+0

Chỉ báo trước khi sử dụng 'router.navigate' và' {replaceUrl: true} 'là nó sẽ đăng ký một sự kiện điều hướng khác. Nếu bạn đang nghe các sự kiện điều hướng (ví dụ: 'NavigationEnd') và không muốn hai sự kiện kích hoạt,' location.replaceState' sẽ thực hiện thủ thuật. – Alan

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