【问题标题】:NullInjectorError: No provider for SwUpdate! SwUpdate does not work Angular 5NullInjectorError:没有 SwUpdate 的提供者! SwUpdate 不起作用 Angular 5
【发布时间】:2019-02-20 05:59:50
【问题描述】:

现在我知道有一百万条关于 No Provider for such and such service 的帖子,我知道它需要进入提供者,请阅读我的整个帖子。

基本上我正在尝试使用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();
           });
    }
}

现在我已经注册了我的 serviceworker:

import { ServiceWorkerModule } from '@angular/service-worker'; 
...

imports: [
    environment.production ? ServiceWorkerModule.register('ngsw-worker.js') : [],
]

现在当我运行我的应用程序时,我收到了这个错误:

NullInjectorError: No provider for SwUpdate!

显然我尝试将它添加到我的组件模块中的 providers 数组中:

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??

任何帮助将不胜感激

编辑

我也尝试过与官方 Angular 文档中完全相同的方式进行操作,但它给了我同样的错误:

constructor(
    updates: SwUpdate
) {
    updates.available
        .subscribe(() => {
            updates.activateUpdate()
                .then(() => document.location.reload());
        });
}

编辑 2 这是我运行 ng -v 时得到的结果

Angular CLI: 1.7.4
Node: 10.15.1
OS: win32 x64
Angular: 5.1.2
... animations, common, compiler, compiler-cli, core, forms
... http, platform-browser, platform-browser-dynamic
... platform-server, router

@angular/cli: 1.7.4
@angular/service-worker: 7.2.7
@angular-devkit/build-optimizer: 0.3.2
@angular-devkit/core: 0.3.2
@angular-devkit/schematics: 0.0.40
@ngtools/json-schema: 1.1.0
@ngtools/webpack: 1.10.2
typescript: 2.4.2
webpack: 3.11.0

编辑 3

经过进一步调查,在本地运行项目时似乎无法使用 SwUpdate,我看到了这篇文章 angular-pwa-pitfalls,解决方案是安装 ng-toolkit,但这只是允许您构建项目然后运行一个模拟服务器,这是没有意义的,因为我失去了在本地开发而不每次都构建项目的能力。

编辑 4

我更改了我的 app.module.ts 来注册 service worker:

ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production })

但现在我遇到了一大堆新错误

任何其他建议都会很棒。

谢谢

【问题讨论】:

  • 你试过检查official documentation在Angular中使用service worker吗?
  • @jess 是的...这就是为什么我要问为什么它不起作用,如果官方文档涵盖了我的问题,我不会发布。
  • 您是否将您的 组件模块 导入到您的 AppModule 中?
  • @JohnVelasquez 是的.. 一切正常,然后当我将 SwUpdate 放入其中时,应用程序会崩溃
  • 只有在本地运行时才会出现这种情况吗?

标签: angular typescript service-worker progressive-web-apps angular-pwa


【解决方案1】:

您的问题在app.module.ts

你需要像这样导入你的 service worker:

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 解决了您的问题,很高兴他们现在让升级变得如此简单 :)

【讨论】:

  • 您是否使用以下命令添加了 service worker:ng add @angular/pwa --project *project-name*?由于该命令在应用程序中添加了所需的步骤/命令
  • 不,我是按照 tutorial 手动完成的,我的项目是 Angular 5,不支持 ng add
  • 我将项目升级到 Angular 7 并运行 ng add @angular/pwa 解决了我的问题。
  • 如果您编辑答案以更新到更高版本的 angular 并运行 ng add @angular/pwa 我会将此答案标记为正确,因为它为我指明了正确的方向
  • : []来自哪里,我可以看到前面没有三元运算符,这对我来说是个错误。
【解决方案2】:

对于那些在尝试编写单元测试时遇到此错误的人,解决方案是在配置 TestBed 时使用 enable to false 选项将 ServiceWorkerModule 添加到导入数组:

TestBed.configureTestingModule({
  declarations: [ MyComponent ],
  imports: [
    ServiceWorkerModule.register('ngsw-worker.js', { enabled: false })
  ]
})
.compileComponents();

【讨论】:

    【解决方案3】:

    经过大量研究,这似乎是angular 5.2.1 的问题,所以......

    我将我的项目升级到angular 7,运行ng add @angular/pwa,这解决了我的问题!

    【讨论】:

    • "@angular/cli": "~7.0.5" 我试试看。但我有错误Invalid rule result: Instance of class Promise.
    【解决方案4】:

    试试下面的代码,将更新添加到 ngOnInit() 方法中。

     constructor(private updates: SwUpdate) {}
    
     ngOnInit(){
         this.updates.available
        .subscribe(() => {
            this.updates.activateUpdate()
                .then(() => document.location.reload());
        });
     }       
    

    【讨论】:

      猜你喜欢
      • 2018-07-16
      • 1970-01-01
      • 2021-09-07
      • 2020-03-23
      • 2020-06-04
      • 2022-01-03
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多