Angular 2+ обнаруживает изменение свойства объекта внутри сервиса - PullRequest
0 голосов
/ 15 января 2019

Допустим, у нас есть сервис, подобный этому:

SupermanService {
  private _superman: Hero;
  public supermanReplaced = new EventEmitter<Hero>();
  public supermanPropertyUpdated = new EventEmitter<Hero>();

  public get superman(): Hero {
    return this._superman;
  }

  public set superman(superman): void {
    this._superman = superman;
    this.supermanReplaced.emit(superman);
  }

  public updateSupermanProperty(key: string, val: string | number): Hero {
    this._superman[key] = val;
    this.supermanPropertyUpdated.emit(superman);
    return this._superman;
  }

}

Есть ли способ обнаружить supermanPropertyUpdated без использования функции updateSupermanProperty(), например, например, настройка this.superman.power = 10?

Я нашел несколько сообщений, в которых предлагается KeyValueDiffer в сочетании с хуком DoCheck, но он недоступен для служб.

1 Ответ

0 голосов
/ 15 января 2019

Вы можете использовать get / set методы.

В вашем примере:

class SupermanService {
  private _superman: Hero;
  public supermanReplaced = new EventEmitter<Hero>();
  public supermanPropertyUpdated = new EventEmitter<Hero>();

  public set power(level: integer) {
    this._superman.power = level;
    this._supermanPropertyUpdated.emit(this._superman);
  }

  public get superman(): Hero {
    return this._superman;
  }

  public set superman(superman: Hero): void {
    this._superman = superman;
    this.supermanReplaced.emit(superman);
  }

  public updateSupermanProperty(key: string, val: string | number): Hero {
    this._superman[key] = val;
    this._supermanPropertyUpdated.emit(superman);
    return this._superman;
  }

}

После этого вы можете использовать:

SupermanService.power = 10;

и все слушатели будут уведомлены

Обновление

Еще одна реализация для решения этой проблемы - изменение класса Hero , добавление открытого свойства EventEmitter и подписка на него из вашего сервиса. Назначьте сеттер для каждого свойства в вашем классе Hero и отправьте изменение, например Output , и в вашем сервисе вы можете отправить изменения.

class Hero {

    public onPropertyChange = new EventEmitter<Hero>();
    private _name: string;

    get name(): string {
        return this._name;
    }

    set name(value: string) {
        this._name = value;
        this.onPropertyChange.emit(this);
    }
}

class SupermanService {
  private _superman: Hero;
  public supermanReplaced = new EventEmitter<Hero>();

  public get superman(): Hero {
    return this._superman;
  }

  public set superman(superman: Hero): void {
    this._superman = superman;
    this.supermanReplaced.emit(superman);
  }

  public get supermanPropertyUpdated(): EventEmitter<Hero> {
    return this._superman.onPropertyChange;
  }
}
...