这与SO问题密切相关Ionic 2 将选项卡 NavParams 传递给选项卡 https://stackoverflow.com/questions/35162308/ionic-2-passing-tabs-navparams-to-tab
我的选项卡视图模板设置为:
<ion-tabs #myTabs>
<ion-tab [root]="tab1Root" tabTitle="Home" tabIcon="home"></ion-tab>
<ion-tab [root]="tab2Root" tabTitle="My Alerts" [rootParams]="paramsData" tabIcon="warning"></ion-tab>
<ion-tab [root]="tab3Root" tabTitle="Settings" [rootParams]="paramsData" tabIcon="cog"></ion-tab>
....
并在类的构造函数中(主选项卡页面)我正在设置根参数.
this.paramsData = {
settings: this.userSettings,
facilities: this.facilities,
};
当我获得值时,这工作正常ionViewDidEnter()选项卡内子页面上的生命周期事件如下。
this.facilities = this.navParams.data.facilities;
let userSettings = this.navParams.data.userSettings;
当我更新的时候根参数 in the 主选项卡页面通过监听如下事件,
listenToSaveEvents(){
this.events.subscribe('save-settings', (userSettings) => {
this.userSettings = userSettings;
this.paramsData = {
settings: this.userSettings,
facilities: this.facilities
};
});
子页面仍然加载过时的数据。
该事件正在触发并且数据正在更新。当该子页面的 ionViewDidEnter() 再次被触发时,它仍然从 navParams 加载旧数据。
关于这一点再多说一点。
我这样做的原因是多个页面共享数据。但它们都需要一致的数据,并且只有一个视图更新它。首次加载时,主选项卡页面可能已经具有从其他服务获取的现有数据。
对此的更新
虽然我仍然想要解决这个问题,但我还是选择了上面链接中的答案 https://stackoverflow.com/a/35176544/1497565.
所以我最终创建了如下所示的服务。
import {Injectable} from '@angular/core';
@Injectable()
export class ParamService {
public paramsData: any;
constructor(){
this.paramsData = {};
}
}
显然,已添加到 AppModule 类中的提供程序数组中。然后使用它类似于我使用 NavParams 的方式,除了注入 ParamService。
this.facilities = this.paramService.paramsData.facilities;
this.userSettings = this.paramService.paramsData.userSettings;
这仍然可以通过指定接口而不是类型来改进any对于 paramsData,因为可以将不同的参数集传递给其他页面/组件。