Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度服务辅助程序SwUpdate.available未触发_Angular_Caching_Apache2_Angular6_Pwa - Fatal编程技术网

Angular 角度服务辅助程序SwUpdate.available未触发

Angular 角度服务辅助程序SwUpdate.available未触发,angular,caching,apache2,angular6,pwa,Angular,Caching,Apache2,Angular6,Pwa,我很难将angulars service worker集成到我的应用程序中。我按照指南做的,到目前为止效果不错。我可以在我的主屏幕上创建一个快捷方式并启动到我的应用程序中。问题是我的应用程序不知怎么地没有更新。如果我更改一个按钮的名称,构建应用程序并将其放到我的服务器上,应用程序仍然显示旧版本,直到我点击F5(重新启动应用程序也没有帮助) 我尝试将以下代码放入我的应用程序的Ngonino中,但没有任何帮助 ngOnInit() { if (this._SwUpdate.isEnabled) {

我很难将angulars service worker集成到我的应用程序中。我按照指南做的,到目前为止效果不错。我可以在我的主屏幕上创建一个快捷方式并启动到我的应用程序中。问题是我的应用程序不知怎么地没有更新。如果我更改一个按钮的名称,构建应用程序并将其放到我的服务器上,应用程序仍然显示旧版本,直到我点击F5(重新启动应用程序也没有帮助)

我尝试将以下代码放入我的应用程序的Ngonino中,但没有任何帮助

ngOnInit() {
if (this._SwUpdate.isEnabled) {

  setInterval( () => {
    this._SwUpdate.checkForUpdate().then(() => console.log('checking for updates'));
  }, this.updateInterval);

  this._SwUpdate.available.subscribe(() => {

    console.log('update found');

    this._SwUpdate.activateUpdate().then(() => {
      console.log('updated');
      window.location.reload();
    });

  });

}
}

该应用程序正在我的apache2 linux机器上运行。我的apache缓存有什么问题吗?或者为什么我的应用程序没有意识到有一个新版本

提前感谢您的帮助:)

编辑:

我的ngsw-config.json

{
  "index": "/index.html",
  "assetGroups": [{
    "name": "roomPlan",
    "installMode": "prefetch",
    "resources": {
      "files": [
        "/index.html",
        "/*.css",
        "/*.js"
      ]
    }
  }, {
    "name": "assets",
    "installMode": "lazy",
    "updateMode": "prefetch",
    "resources": {
      "files": [
        "/assets/**"
      ]
    }
  }]
}
编辑2:


如果我使用“http服务器”在本地运行应用程序,它会工作,但当我将文件复制到apache时,它不会检测到更新。在networking选项卡中,我可以看到时间间隔是有效的,应用程序每3秒从服务器获取一个新的“ngsw.json”。如果我更新我的应用程序,我可以看到“ngsw.json”响应中有新的哈希值。之后,浏览器会从我的服务器加载新的“index.html”和“main.*.js”,但应用程序不会应用新版本。根据我的代码,应该是“找到更新”,但什么也没发生。

您可能需要告诉服务人员检查服务器是否有更新,我通常使用服务:

export class UpdateService {

  constructor(public updates: SwUpdate) {
    if (updates.isEnabled) {
      interval(6 * 60 * 60).subscribe(() => updates.checkForUpdate()
        .then(() => console.log('checking for updates')));
    }
  }

  public checkForUpdates(): void {
    this.updates.available.subscribe(event => this.promptUser());
  }

  private promptUser(): void {
    console.log('updating to new version');
    this.updates.activateUpdate().then(() => document.location.reload()); 
  }
在您的
应用程序组件.ts
中:

  constructor(private sw: UpdateService) {
    // check the service worker for updates
    this.sw.checkForUpdates();
  }

无论出于何种原因,Angular有时没有正确注册服务人员。因此,您可以修改'main.ts': 替换:

platformBrowserDynamic().bootstrapModule(AppModule);
与:


更改应用程序时,需要使用此方法activateUpdate(

从'@angular/service worker'导入{SwUpdate};
导出类AppComponent实现OnInit{
构造函数(私有swUpdate:swUpdate){}
恩戈尼尼特(){
此.swUpdate.available.subscribe(事件=>{
log('新版本现在可用。立即刷新页面以更新缓存');
});
this.swUpdate.checkForUpdate()
}
}

检查此链接:

在堆栈上的所有其他解决方案都不起作用后,我开始调试angular的ngsw-worker.js脚本。我跟踪了更新逻辑,最后使用了“PrefetchAssetGroup”方法。每次调用该方法时,我都会插入日志记录,然后我意识到它一直在尝试缓存我的favicon.ico。
我检查了我的ngsw.json中favicon.ico的位置,发现favicon不在那里。一旦我将图标放在该位置,一切都开始正常工作。

这对我在所有mac/windows/ios/android设备上都有效

导出类pwaUpdate服务{
更新订阅;
构造函数(公共更新:SwUpdate){
}
public checkForUpdates():void{
this.updateSubscription=this.updates.available.subscribe(event=>this.promptUser());
如果(this.updates.isEnabled){
//需要在Windows和ios上启用更新。
this.updates.activateUpdate();
间隔(60*60*1000)。订阅(()=>{
this.updates.checkForUpdate()。然后(()=>{
//log(“检查更新”);
});
});
}
//重要提示:在Safari(ios)上,Heroku不会自动将链接重定向到https,这允许像往常一样安装pwa
//但它会停用swUpdate。因此,请确保在safari上打开您的pwa,如下所示:https://example.com 然后(安装/添加到主页)
}
promptUser():void{
this.updates.activateUpdate()。然后(()=>{
window.location.reload();
});
}
}

要检查Angular的较新版本是否可用,您可以从任何组件调用下面的方法,或者只需复制
app.component
中的
IsNewServersOnAvailable
方法即可

导出类数据服务{
构造函数(私有http:HttpClient,私有swUpdate:swUpdate){}
私有可用:布尔值=false;
isNewServersOnAvailable(){
if(this.swUpdate.isEnabled){
此.swUpdate.available.subscribe(()=>{
this.available=true;
});
console.log(this.available);
}
将此文件返回可用;
}    
}

我在文件中找到了以下信息:

总结: 角度站点上有一个有用的端点,显示服务工作者状态:

http://site-url/ngsw/state

/ngsw/state
附加到您的站点地址。如果服务有问题,它应该显示在那里。

我按照您所说的做了(打开一个空选项卡,并在进行更改后重新启动http服务器)但是服务人员没有更新到新版本,我必须完全关闭浏览器并重新启动它以获取最新版本。我的ngsw config.json是否有问题?仍然不工作,SwUpdate.available.subscribe从未被触发,但我不知道为什么。我在其中放置了一个console.log,但我永远看不到它。如果我构建d我的应用程序并将其放置在我的服务器上服务人员根本不对其作出反应抱歉,您可以添加此项。_swUpdate.checkForUpdate()在您的if条件中我使用的间隔是每10秒检查一次更新,但它对新版本没有反应(我更新了代码示例)我不确定是否允许我共享整个代码,因为这是一个内部项目。我可以提供哪些文件来提供帮助?只要我正确理解SwUpdate…我进入我的应用程序,写“hello world”在任何组件中,ng build--生产我的应用程序,将其复制到我的apache2,服务人员应该刷新它…对吗?是的,在yourdomain.com/ngsw/state检查任务队列中是否有任何内容我刚刚完全重置了我的测试系统并设置了一个新的apache服务器..在main.ts中应用修复后,一切正常现在,谢谢你帮助我out@BhaumikThakkar请看d
http://site-url/ngsw/state