Angular2 переносит значение переменной при смене страниц - PullRequest
0 голосов
/ 24 октября 2018

У меня есть многостраничный веб-сайт (с использованием маршрутизатора), и я хотел бы перенести значение переменной с одной страницы на другую.

На моей странице контактной формы у меня есть следующий код:

testName:string = "hello";

ngOnInit()
{       
    this.dataService.Stream
        .subscribe(
            (city:City) => this.processData(city),
            (err) => console.log('Error at processing data'),
            () => console.log('Complete...')
        )
}

processData(city:City)
{
    console.log('the city name is: ', this.testName);
    this.problematicCity = city;
    this.testName = city.name;
    console.log('received data for city: ', this.testName);
}

Когда я на главной странице и отправляю город в службу данных, я получаю следующий вывод вконсоль:

the city name is: hello
received data for city: Luxemburg

Поэтому я знаю, что информация передается правильно.Тем не менее, когда я перехожу на страницу контактов, testName меняется на «привет».

Как я могу предотвратить это?Я попытался не инициировать testName, но затем я получаю сообщение об ошибке: assignment to undeclared variable string.

Перемещение testName:string = "hello"; в ngOnInit также приводит к той же ошибке.

Добавление: Это моя служба данных:

//data.service.ts
import {Subject} from 'rxjs/Subject';
import {Injectable} from 'angular2/core';
import {City} from '../model/city.model';

@Injectable()

export class DataService
{
    Stream:Subject<City>;

    constructor()
    {
        this.Stream = new Subject();
    }
}

1 Ответ

0 голосов
/ 24 октября 2018

Вы создаете Subject: это прокси, который служит наблюдателем и наблюдателем.

Когда вы создаете [Behavior|Replay]Subject, вы создаете горячий поток : любой наблюдатель, подписавшийся на него, получит его последнее значение.

Это отличается от холодного потока , как HTTP-вызовы, когда передается весь поток: как только вы подписались на него, и наблюдаемое завершено, вы не подписаны на негобольше.

В кодовых словах это означает, что каждый раз, когда вы создаете экземпляр своего компонента контакта, вы создаете новую подписку, и код подписки запускается каждый раз, когда вы звоните next по вашей теме ИЛИ при создании новой подписки (горячие потоки получают последнее значение потока при первой подписке).

Чтобы избежать этого, вы можете либо ограничить подписку одним вызовом, либо удалить подписку при уничтожении компонента,Я рекомендую последнее:

ngOnInit() {
  this.streamSubscription = this.dataService.Stream.subscribe(...);
}

ngOnDestroy() {
  this.streamSubscription.unsubscribe();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...