Helpex - Trao đổi & giúp đỡ Đăng nhập
11

Với mã này

ngOnInit() {
  this.router.events.subscribe((val) => {
    if (this.router.url.indexOf('page') > -1) {
      let id = this.activedRoute.snapshot.params['Id']
      this.busy = this.httpCall.get('/pub/page/GetPageById/' + id)
        .subscribe(data => {
          this.pages = <Page[]>data
        })

      console.log(id)
    }
  })
}

khi tôi điều hướng đến domain.com/#/en/page/13nó, nhật ký 13như mong đợi.

Nhưng khi tôi điều hướng đến trang đó id là 27nó ghi: 13 13 27.

Khi tôi điều hướng trở lại 13log có: 27 27 13.

Tại sao lại như vậy?

11 hữu ích 0 bình luận 9.5k xem chia sẻ
8

Từ nhật ký của bạn, bạn có thể thấy rằng đăng ký của bạn được gọi ba lần trên mỗi lần thay đổi tuyến đường. Vì vậy, điều đó có nghĩa là các sự kiện có thể quan sát phát ra nhiều tín hiệu nhưng bạn chỉ quan tâm đến một.

 ngOnInit() {
        this.getData();
        this.router.events.filter(event => event instanceof NavigationEnd).subscribe(event =>  this.getData());    
  }
  getData(){
        if (this.router.url.indexOf('page') > -1) {
            let Id = this.activedRoute.snapshot.params['Id'];
            this.busy = this.httpCall.get('/pub/page/GetPageById/' + Id)
                     .subscribe(
                            data => {
                                this.pages = <Page[]>data;
                            });

             console.log(Id);
        }
    }
8 hữu ích 3 bình luận chia sẻ
10

Bạn phải hủy đăng ký khi phá hủy thành phần của mình.

Đầu tiên bạn phải

import { OnDestroy } from '@angular/core;'

Sau đó bạn phải

export class myClass implements OnInit, OnDestroy {
    myObserver = null;
    // Rest of your code
}

Trong ngOnInit của bạn, bạn phải

ngOnInit() {
    this.myObserver = this.router.events.subscribe(...);
}

Sau đó, tạo một hàm

ngOnDestroy() {
    this.myObserver.unsubscribe();
}
10 hữu ích 4 bình luận chia sẻ
0

Điều này xảy ra khi bạn viết "this.router.events" trên ngOnInit hoặc Constructor, Để khắc phục sự cố này, bạn nên viết nó trên một hàm khác như sau:

onRouteChange () {
    this.router.events.subscribe((event) => {
      if (event instanceof NavigationStart) {
        if (this.router.url.indexOf('page') > -1) {
            let Id = this.activedRoute.snapshot.params['Id'];
            this.busy = this.httpCall.get('/pub/page/GetPageById/' + Id)
                .subscribe(
                data => {
                    this.pages = <Page[]>data;
                });

            console.log(Id);    
        }
      }
    })
  }

nhưng có một vấn đề khác trong đó bạn nên xem xét khi sử dụng "this.router.events.subscribe", mọi thứ bạn đã viết ra trong hàm này sẽ xảy ra khi bạn điều hướng trong các trang vì vậy tốt hơn nên sử dụng dòng này để ngăn chạy nó trên mọi thay đổi đường dẫn:

import {Router, NavigationStart} from '@angular/router';

onRouteChange () {
    this.router.events.subscribe((event) => {
      if (event instanceof NavigationStart) {
        // this line
        if(event.url == 'your_page_path')
        if (this.router.url.indexOf('page') > -1) {
            let Id = this.activedRoute.snapshot.params['Id'];
            this.busy = this.httpCall.get('/pub/page/GetPageById/' + Id)
                .subscribe(
                data => {
                    this.pages = <Page[]>data;
                });

            console.log(Id);    
        }
      }
    })
  }
0 hữu ích 0 bình luận chia sẻ
0

Bước 1:

_routerSub = Subscription.EMPTY;

Bước 2:

ngOnInit(){

    this._routerSub = this.router.events
        .pipe(filter((event: RouterEvent) => event instanceof NavigationEnd))
        .subscribe(() => {
            this.getPosts(this.activatedRoute.snapshot.params.cattmpd);
         });
}

ngOnDestroy(): {

    this._routerSub.unsubscribe()

}
0 hữu ích 0 bình luận chia sẻ
0

Tôi đã phải đối mặt với cùng một vấn đề. Tôi có thể giải quyết bằng cách duy trì một lá cờ

ngOnInit() {
        this.router.events.filter(event => event instanceof 
        NavigationEnd).subscribe(() => {
        let render = false;
        if(this.router.url.indexOf('page') > -1 && !render){
        //here goes logic 
        render = true;
      }
    }
  }**
0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ angular , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading