NullInjectorError: Нет провайдера для SwUpdate! SwUpdate не работает Angular 5
Теперь я знаю, что существует миллион постов об отсутствии провайдеров для того или иного сервиса, и я знаю, что для этого нужно обратиться к провайдерам, пожалуйста, прочитайте весь мой пост.
В основном я пытаюсь использовать SwUpdate
чтобы проверить, если есть обновление, обновите браузер так
import { SwUpdate } from '@angular/service-worker';
...
export class ...
constructor(
private _swUp: SwUpdate
){}
ngOnInit() {
this.checkForUpdate();
}
checkForUpdate() {
if (this._swUp.isEnabled) {
this._swUp.available
.subscribe(() => {
window.location.reload();
});
}
}
теперь я зарегистрировал своего работника по обслуживанию оборудования так...
import { ServiceWorkerModule } from '@angular/service-worker';
...
imports: [
environment.production ? ServiceWorkerModule.register('ngsw-worker.js') : [],
]
теперь, когда я запускаю свое приложение, я получаю эту ошибку...
NullInjectorError: No provider for SwUpdate!
так очевидно, что я пытаюсь добавить его в массив поставщиков в моем модуле компонента, как это...
import { ServiceWorkerModule, SwUpdate } from '@angular/service-worker';
...
imports: [
environment.production ? ServiceWorkerModule.register('ngsw-worker.js') : [],
],
providers: [
SwUpdate
]
теперь это должно работать, но теперь, когда я запускаю приложение, я получаю следующую ошибку
NullInjectorError: No provider for NgswCommChannel!
Теперь, когда я пытаюсь импортировать NgswCommChannel
Я получаю сообщение о том, что его нет в @ angular / service-worker;
Я пытался погуглить, но не могу найти ссылку на NgswCommChanel
в любом месте...
Поэтому мой вопрос: как я могу это исправить или как правильно использовать SwUpdate
??
любая помощь будет оценена
РЕДАКТИРОВАТЬ
Я также пытался сделать это ТОЧНО таким же образом, как это делается в официальных угловых документах, и это дает мне ту же ошибку
constructor(
updates: SwUpdate
) {
updates.available
.subscribe(() => {
updates.activateUpdate()
.then(() => document.location.reload());
});
}
Спасибо
0 ответов
Ваша проблема в app.module.ts
,
Вам нужно импортировать вашего сервисного работника следующим образом:
imports: [
ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }) : [],
],
Код, который у вас был ранее, включал модуль только тогда, когда вы работали в производственном режиме, поэтому во время разработки он вообще не включал модуль.
РЕДАКТИРОВАТЬ:
Внутри моего app.component.ts
Я имею:
constructor(private swUpdate: SwUpdate) { }
ngAfterViewInit() {
if (this.swUpdate.isEnabled) {
this.swUpdate.available
.subscribe(() => {
this.swUpdate
.activateUpdate()
.then(() => {
window.location.reload();
});
});
}
}
РЕДАКТИРОВАТЬ:
Согласно вашему комментарию, обновление до последней версии Angular исправило вашу проблему, хорошо, что теперь они сделали обновление настолько простым:)
Для тех, кто получает эту ошибку при попытке написать модульные тесты, решение состоит в том, чтобы добавить ServiceWorkerModule в массив импорта с параметром enable to false при настройке TestBed:
TestBed.configureTestingModule({
declarations: [ MyComponent ],
imports: [
ServiceWorkerModule.register('ngsw-worker.js', { enabled: false })
]
})
.compileComponents();
После долгих исследований кажется, что это была проблема с angular 5.2.1
так..
Я обновил свой проект до angular 7
, побежал ng add @angular/pwa
и это решило мою проблему!
Попробуйте приведенный ниже код, добавьте обновление в метод ngOnInit().
constructor(private updates: SwUpdate) {}
ngOnInit(){
this.updates.available
.subscribe(() => {
this.updates.activateUpdate()
.then(() => document.location.reload());
});
}