ionic 3 中的本地存储和选项卡菜单

Posted

技术标签:

【中文标题】ionic 3 中的本地存储和选项卡菜单【英文标题】:locastorage and tabs menu on ionic 3 【发布时间】:2018-03-27 11:23:42 【问题描述】:

我在 tabs1 上有一张地图。

我单击标记并发送本地存储标记标题并发送到 tab2。那工作很好。

that.passingData(dogwalkMarker.valueOf().parkid);

passingData(something: string) 
localStorage.setItem('passingData', JSON.stringify(something));
console.log(something);

但是当我在返回后第一次加载 tab2 时,出现了问题。在我在应用程序上加载任何页面并加载选项卡 2 后,它可以正常工作并返回良好!

我不明白我在哪里做错了。谢谢。

我在标签 2 上有以下代码。

scanOtopark() 
this.selectedOtopark = ;
let x = JSON.parse(localStorage.getItem('passingData'));

this.selectedOtopark = this.otoparks.find(otopark => otopark.parkqr === x);
if (this.selectedOtopark !== undefined) 
  this.otoparkFound = true;

  const toast = this.toastCtrl.create(
    message: "good",
    duration: 3000,
    position: 'top'
  );
  toast.present();
  console.log(this.selectedOtopark);
 else 
  this.otoparkFound = false;
  const toast = this.toastCtrl.create(
    message: 'something goes wrong',
    duration: 3000,
    position: 'top'
  );
  toast.present();
  this.selectedOtopark = ;

【问题讨论】:

【参考方案1】:

您的本地存储似乎有async 问题。所以我强烈建议您使用native storage module。由于它支持开箱即用的 Promise,因此您可以轻松地在 async 情况下使用它。如果您也安装 SQLite,它也可以在所有平台上正常工作(尤其是 ios 设备,这是必需的。)

文档中的示例:

 // set a key/value
  storage.set('name', 'Max');

  // Or to get a key/value pair
  storage.get('age').then((val) => 
    console.log('Your age is', val);
  );

更新:

first time load你需要使用:

 this.platform.ready().then(() => 

    );

更新 2:

x: any;

scanOtopark() 
this.selectedOtopark = ;


this.platformCtrl.ready().then(() => 
  this.storageCtrl.get('passingData').then((data) => 
    this.x= data;

  this.selectedOtopark = this.otoparks.find(otopark => otopark.parkqr === this.x);
  if (this.selectedOtopark !== undefined) 
    this.otoparkFound = true;

    const toast = this.toastCtrl.create(
      message: "good",
      duration: 3000,
      position: 'top'
    );
    toast.present();
    console.log(this.selectedOtopark);
   else 
    this.otoparkFound = false;
    const toast = this.toastCtrl.create(
      message: 'something goes wrong',
      duration: 3000,
      position: 'top'
    );
    toast.present();
    this.selectedOtopark = ;
  
 );
);

【讨论】:

你好。 @Sampath 我试过这个。但它仍然会出现同样的问题。 this.storageCtrl.get('passingData').then((data) => this.x= data; console.log(data); ); 查看更新 我将所有代码复制到 this.platform.ready().then(() => ); 中,但不起作用。 你能显示last code的变化吗?把它放在你的问题之下。 你在哪里用过这个this.x= data;【参考方案2】:

解决方案

那是我的错,因为我在构造函数中定义了获取数据库代码。因为该页面需要加载才能获取数据。

忘记的代码部分

constructor(private navCtrl: NavController,
          ...
          ...
          ...
          ...
          private storageCtrl: Storage,
          private platformCtrl: Platform,
          ) 

this.firebaseProvider.getOtoparks().subscribe((response) => 
  this.otoparks = response;
  console.log(this.otoparks);
);

所以我在函数中导入该代码并且它可以工作!

tab1

passingData(something: string) 
this.platformCtrl.ready().then(() => 
  this.storageCtrl.set('passingData', something);
  console.log(something);
);

tab2

passingData: any;
scanOtopark() 
this.platformCtrl.ready().then(() => 
  this.storageCtrl.get('passingData').then((data) => 
    this.passingData = data;
    this.firebaseProvider.getOtoparks().subscribe((response) => 
      this.otoparks = response;
      this.selectedOtopark = this.otoparks.find(otopark => otopark.parkqr === this.passingData);

      if (this.selectedOtopark !== undefined) 
        this.otoparkFound = true;
        console.log(this.selectedOtopark);


        const toast = this.toastCtrl.create(
          message: "good",
          duration: 3000,
          position: 'top'
        );
        toast.present();
       else 
        this.otoparkFound = false;
        const toast = this.toastCtrl.create(
          message: 'something goes wrong',
          duration: 3000,
          position: 'top'
        );
        toast.present();
      
    );
  );
);

【讨论】:

以上是关于ionic 3 中的本地存储和选项卡菜单的主要内容,如果未能解决你的问题,请参考以下文章

Ionic 选项卡无法在 Android 上正确呈现?

具有多个浏览器选项卡/窗口的主干.js 和本地存储覆盖数据

关闭所有选项卡时删除/清除本地存储[重复]

适合 Ionic 3 的本地存储

使用本地存储在引导程序 4 中保持页面刷新的活动选项卡?

如何在关闭特定选项卡而不是在 Angular 2 中关闭浏览器时清除本地存储?