Как сохранить данные на постоянной основе с помощью Ionic 3? - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь создать начальную страницу, которая будет читать QR-код, сохранять код и переходить на другую страницу.Это произойдет только при первом открытии приложения.При закрытии приложения и повторном открытии страница введения не должна появляться.Итак, в чем моя проблема?Я сохраняю код, который прочитал, но когда я закрываю приложение и открываю снова, код, который я сохранил, теряется, и появляется страница введения.Как мне решить эту проблему?

Мой код IntroPage:

import { NativeStorage } from '@ionic-native/native-storage';
const STORAGE_KEY = 'hospitals';
...
scannedCode:string = null;

constructor(private navCtrl: NavController, 
            private barcodeScanner: BarcodeScanner, 
            private nativeStorage: NativeStorage,
            private toast: Toast) {}

public scanCode() {
  this.barcodeScanner.scan().then(barcodeData => {
    this.scannedCode = barcodeData.text;
    if (this.scannedCode === "123"){
      this.save(this.scannedCode);
      this.navCtrl.push(LoginPage);
    }
    else{
      this.makeToastMessage('Invalid Hospital!', '5000', 'bottom');
    }
  }, (err) => {
    console.log('Error: ', err);
  });
};

private save(val){
  console.log('data added ' + val);
  this.nativeStorage.setItem(STORAGE_KEY, {property: val})
    .then(
      () => console.log('Stored item!'),
      error => this.makeToastMessage('Error storing item', '5000', 'center')
    );
};

И мой код app.component.ts:

import { NativeStorage } from "@ionic-native/native-storage";
const STORAGE_KEY = 'hospitals';
...
rootPage:any;

constructor(platform: Platform, statusBar: StatusBar, 
            splashScreen: SplashScreen, public push: Push,
            public alertCtrl: AlertController, 
            private nativeStorage: NativeStorage) {
  platform.ready().then(() => {
    // Okay, so the platform is ready and our plugins are available.
    // Here you can do any higher level native things you might need.
    statusBar.styleDefault();
    splashScreen.hide();
    this.pushsetup();
    this.setRootPage();
  });
}

private setRootPage(){
  let localStorage:string = "Not got";
  this.nativeStorage.getItem(STORAGE_KEY)
    .then(
      item => localStorage = item.properity,
      error => console.log("Error getting item. Error: " + error)
    );
  alert(localStorage);

  switch (localStorage){
    case "123":
      this.rootPage = LoginPage;
      break;
    default:
      this.rootPage = IntroPage;
      break;
  }
}

1 Ответ

0 голосов
/ 28 мая 2018

Это не потеряно.Вы проверяете значение вне вашего обещания, затем выполняете функцию, чтобы оно могло быть выполнено до того, как будут получены данные.Вам нужно либо использовать регистр коммутатора в then, где вы ищете данные, либо связать обещания.

private setRootPage(){
  let localStorage:string = "Not got";
  this.nativeStorage.getItem(STORAGE_KEY)
    .then(
        item => localStorage = item.properity,
        error => console.log("Error getting item. Error: " + error)
    ).then(_=>{
         switch (localStorage){
            case "123":
                this.rootPage = LoginPage;
                break;
            default:
                this.rootPage = IntroPage;
                break;
        }
    });
}

Это обеспечит проверку значения только после значение извлекается из хранилища.

Или коротко:

 private setRootPage(){
      this.nativeStorage.getItem(STORAGE_KEY)
        .then(
            item => {
                switch (item.property){
                case "123":
                    this.rootPage = LoginPage;
                    break;
                default:
                    this.rootPage = IntroPage;
                    break;
                }

            },
            error => console.log("Error getting item. Error: " + error)
        )


}
...