2016-12-31 2 views
3

В методе ngOnDestroy я отписаться от наблюдаемой, которую я подписался на один раз еще код multipletimes выполняется ...Как отписаться от obserable внутри маршрута Resolve класса

ngOnInit() 
{ 
    this.sub = this.route.params.subscribe(params => 
    { 
     this.projectId = +params['id']; 
     this.projectStore.project = this.projectId; 

     // load data when the route changes 
     this._tasksService.gettasks(this.projectId).subscribe(years => { this.tasks = years.map(y => new task(y)) }); // no need to clean up the subscription 

    }); 
    // load data when the component is initialized 
    this._tasksService.gettasks(this.projectId).subscribe(years => { this.tasks = years.map(y => new task(y)) }); // no need to clean up the subscription 

} 

ngOnDestroy() 
{ 
    this.sub.unsubscribe(); 
} 

Теперь я хочу, чтобы поставить это в классе разрешения маршрутизатора, но нет ngOnDestroy - конечно - просто событие NavigationEnd, к которому я снова мог бы подписаться.

Это означает, что я подписываюсь на событие NavigationStart (которое происходит, когда я покину маршрут) для того, чтобы отписаться другой подписка, которая является маршрут Params подписки изменения Хахаха ...

Я думаю, это еще не путь , но google ничего не предлагал.

Кто-нибудь знает, как решить этот сценарий? Или следует переназначать изменения параметров, которые действительно ТОЛЬКО относятся к компоненту?

constructor(private service: TasksService, private router: Router) 
    { 

    this.navigationEnded = this.router.events 
     .filter(event => event instanceof NavigationStart) 
     .map(() => this.router.routerState.root) 
     .subscribe((event) => 
     { 
     this.navigationEnded.unsubscribe(); 
     }); 
    } 

UPDATE

Когда я ставлю этот код в Resolve метода:

this.route.params.subscribe(params => 
    { 
     // reload data by the new id parameter does not work with params 
     // I have to use inside here: route.params['id'] 
    }); 

нет идентификатора в массиве Params, его только длины 0.

Вместо этого мне нужно использовать route.params ['id'], чтобы узнать, как это сделать, но почему?

+0

Мне не совсем ясно, в чем проблема или что вы на самом деле пытаетесь выполнить. Почему, по-вашему, вам нужно отказаться от подписки? Маршрутизатор, внедренный в сервис, является корневым маршрутизатором, и этот маршрутизатор будет оставаться неизменным на весь срок службы приложения. –

+0

Я пытаюсь выполнить: я хочу поместить рабочий код из ngOnInit/ngOnDestroy в класс разрешения маршрутизатора, и поведение должно быть одинаковым без класса разрешения маршрутизатора. – Pascal

+0

Я хотел бы использовать функцию разрешения, потому что загрузка данных, а затем активация вида маршрута имеет лучший конечный пользователь UX. – Pascal

ответ

3

Вы можете использовать только оператор first(). Таким образом, наблюдаемое завершается после первого события. Не нужно отказываться от подписки таким образом:

this.router.events 
    .filter(event => event instanceof NavigationStart) 
    .map(() => this.router.routerState.root) 
    .first() 
    .subscribe((event) => 
    { 
    //this.navigationEnded.unsubscribe(); 
    }); 
+0

Я понял, что Route/Router, введенный в класс типа Resolve , приводит к неопределенному экземпляру маршрута/маршрутизатора. Кроме того, когда я помещаю этот код в метод разрешения: this.route.params.subscribe (params => {} У экземпляра params нет параметров, таких как id }); – Pascal

+0

«Роутер» должен определенно работать. Маршрут передается в метод 'resolve (...)' https://angular.io/docs/ts/latest/guide/router.html#!#resolve-guard –

+0

Извините, да Маршрутизатор работает даже с маршрутом. Не знаю, почему это работает сейчас. Посмотрите мое обновление в моем вопросе об инициализации :-) – Pascal

Смежные вопросы