#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 был деактивирован, потеряно два дня : ( )