Одноэлементный сервис в Angular (w / Ionic)

#angular #ionic-framework #dependency-injection

#angular #ионный фреймворк #внедрение зависимостей

Вопрос:

У меня возникли некоторые проблемы при попытке создать одноэлементный сервис для предоставления состояния в моем приложении: в некоторых случаях при создании страницы служба получает новый экземпляр, но только на некоторых страницах. Для навигации между страницами я использую метод navigateRoot() NavController, не знаю, может ли это помочь.

Вот сервис:

 @Injectable({
  providedIn: 'root',
})
export class StateService implements OnDestroy {
  count: number;

  constructor() {
    this.count = 0;
    console.log('Service created');
  }

  setState() {
    this.count  ;
  }

  ngOnDestroy() { // Never gets called
    console.log('Service closed'); 
  }
}
 

Компонент:

 @Component({
  selector: 'a-page',
  templateUrl: './a.page.html',
  styleUrls: ['./a.page.scss'],
})
export class APage implements OnInit {

  constructor(
    ...
    private state: StateService
  ) {
    this.state.setState();
    ...
  };

}
 

Я также пробовал метод, при котором я добавляю сервис к app.component.ts поставщикам, но это тоже не сработало.

Заранее благодарю вас всех!

Комментарии:

1. при уничтожении должно быть реализовано на странице, а не на сервисе, сервис не может быть удален, за исключением случаев, когда вы сами устанавливаете его переменные с помощью функции и очищаете переменные ur в этой функции до их состояния по умолчанию, теперь я не знал, какого сценария вам нужно достичь, но это краткое изложение предназначено для части ngOnDestroy. Теперь вам нужно уточнить или дать простой сценарий того, чего вы хотите достичь, чтобы я мог помочь вам достичь этого..

2. @MostafaHarb ngOnDestroy был просто для того, чтобы проверить, уничтожается ли служба до создания новой (моя ошибка). Чего я пытаюсь добиться, так это иметь способ иметь состояние (и, более конкретно, конечные автоматы с помощью xstate) во всем приложении. Я расширил проблему, потому что думал, что это не будет иметь значения. Объясняю вам поток с точки зрения страниц: Заставка -> Пин-код -> Меню -> Информация -> Меню. На каждой странице вызывается конструктор StateService, за исключением второго раза на странице меню. Я не вижу, что может вызвать такое поведение

3. Добавьте код ur внутри ionViewWillEnter(), а не в конструктор, поскольку конструктор запускается при открытии страницы и не будет вызываться снова, кроме как после полного уничтожения страницы, поэтому ionViewWillEnter будет вызываться при каждом обращении к странице..

4. @MostafaHarb извините, но я не понимаю, как это может решить мою проблему. Я хочу иметь только один экземпляр StateService в моем приложении. Проблема сейчас в том, что «Созданная служба» регистрируется в каждом представлении, теряя все состояние при каждой загрузке нового представления

5. Хорошо, тогда удалите это.count = 0 в конструкторе и добавьте = 0 непосредственно в объявление, count:number = 0, и состояние не будет сбрасываться на ноль при каждом обращении к сервису, поскольку каждый раз, когда вы вызываете какую-либо функцию, конструктор также будет активирован, и он делаеткаждый раз счетчик равен нулю..

Ответ №1:

По-видимому, импорт сервиса на определенной странице имел .js расширение, которое приводило к сбоям во всем приложении (linter был деактивирован, потеряно два дня : ( )