Невозможно разрешить все параметры для хранилища: (?)

Я получаю значения от модального, и я хочу сохранить и получить его с помощью локального хранилища в проекте ionic2 angular2. Мой код приведен ниже. Он дает следующую ошибку:

введите описание изображения здесь

В home.ts странице, я импортировал хранилище

import { Storage } from '@ionic/storage';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html',
  providers :[
  Storage
]
})

export class HomePage {
 private DistanceUnit: string;
 private selectedRadious : number;

 constructor(public navCtrl: NavController
          public modalCtrl: ModalController,
          public storage: Storage) {


}

presentModal() {
this.storage.get('distUnit').then((val) => {
  console.log('Your distUnit is', val);
  this.DistanceUnit = val;     
})
.catch(err=>{
  console.log('Your distUnit dont exist: ' + JSON.stringify(err));
  this.DistanceUnit = 'Meters';
});

 this.storage.get('SetRadious').then((val) => {
  console.log('Your SetRadious is', val);
  this.selectedRadious = val;
})
 .catch(err=>{
  console.log('Your SetRadious dont exist: ' + JSON.stringify(err));
    this.selectedRadious = 500;
});


let obj = {selectedRadious: this.selectedRadious, DistanceUnit: this.DistanceUnit};
let myModal = this.modalCtrl.create(SettingModalPage, obj);

myModal.onDidDismiss(data => {
  console.log('modal value: '+data.DistanceUnit)
  this.DistanceUnit = data.DistanceUnit;
  this.selectedRadious = data.selectedRadious;

 this.storage.set('distUnit', this.DistanceUnit);
 this.storage.set('SetRadious', this.selectedRadious);
});

myModal.present();
}
}

В app.module.ts файле

import { NgModule, ErrorHandler } from '@angular/core';
import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
import { HttpModule } from '@angular/http';
import { Storage } from '@ionic/storage';
import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { DetailsPage } from '../pages/details/details';

import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { TypeApi } from '../shared/shared';
import { PlaceDetailService } from '../shared/shared';
import { LaunchNavigator, LaunchNavigatorOptions } from '@ionic- native/launch-navigator';
import { SettingModalPage } from '../pages/setting-modal/setting-modal';

@NgModule({
  declarations: [
  MyApp,
  HomePage,
  DetailsPage,
  SettingModalPage

],
imports: [
  IonicModule.forRoot(MyApp),
  HttpModule
],
bootstrap: [IonicApp],
  entryComponents: [
  MyApp,
  HomePage,
  DetailsPage,
  SettingModalPage
],
providers: [
  Storage,
  TypeApi,
  PlaceDetailService,
  LaunchNavigator,
  StatusBar,
  SplashScreen,
  {provide: ErrorHandler, useClass: IonicErrorHandler}
]
})
export class AppModule {}

Ответ 1

От @ionic/storage version - 2.0.0, выполните следующие изменения:

app.module.ts

import { IonicStorageModule } from '@ionic/storage';

//..
@ngModule({

imports: [
  IonicModule.forRoot(MyApp),
  HttpModule,
  IonicStorageModule.forRoot(),
]

Примечание: вам нужно удалить import { Storage } from '@ionic/storage';

Ознакомьтесь с примечаниями к выпуску здесь

Ответ 2

Я столкнулся с одной и той же проблемой, следуя этой прохладной игре. Если вы решите следовать требованиям, убедитесь, что вы установили плагины cordova, перечисленные в начале видео:

https://www.youtube.com/watch?v=Cnj9fQCyflY

http://technotip.com/5171/ionic-storage-ionic-2/

и вот как вы разрешите ошибку:

В Ионном 3...

Из приведенного ниже URL:

https://ionicframework.com/docs/storage/

Во-первых, если вы хотите использовать SQLite, установите плагин cordova-sqlite-storage:

ionic cordova plugin add cordova-sqlite-storage

Затем установите пакет (поставляется по умолчанию для Ionic apps > Ionic V1):

npm install --save @ionic/storage

Затем добавьте его в список импорта в своем объявлении NgModule (например, в src/app/app.module.ts):

import { IonicStorageModule } from '@ionic/storage';

@NgModule({
  declarations: [
    // ...
  ],
  imports: [      
    BrowserModule,
    IonicModule.forRoot(MyApp),
    IonicStorageModule.forRoot()
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    // ...
  ],
  providers: [
    // ...
  ]
})
export class AppModule {}

Наконец, добавьте его в любой из ваших компонентов или страниц:

import { Storage } from '@ionic/storage';

export class MyApp {
  constructor(private storage: Storage) { }

  ...

  // 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);
  });
}

Ответ 3

Вам нужно переместить код, в котором вы получаете доступ к значениям из разрешенного обещания, в .then() этого обещания. Поскольку это будет асинхронная операция, к моменту ее использования она может быть недоступна.

например. это может сработать:

presentModal() {
    this.storage.get('distUnit').then((val) => {
        console.log('Your distUnit is', val);
        this.DistanceUnit = val;
        this.storage.get('SetRadious').then((val) => {
            console.log('Your SetRadious is', val);
            this.selectedRadious = val;

            this.modalCreator();
        })
        .catch(err=>{
            console.log('Your SetRadious dont exist: ' + JSON.stringify(err));
            this.selectedRadious = 500;
            this.modalCreator();
        });
    })
    .catch(err=>{
        console.log('Your distUnit dont exist: ' + JSON.stringify(err));
        this.DistanceUnit = 'Meters';

        this.storage.get('SetRadious').then((val) => {
            console.log('Your SetRadious is', val);
            this.selectedRadious = val;

            this.modalCreator();
        })
        .catch(err=>{
            console.log('Your SetRadious dont exist: ' + JSON.stringify(err));
            this.selectedRadious = 500;
            this.modalCreator();
        });
    });
}

modalCreator(){
    let obj = {selectedRadious: this.selectedRadious, DistanceUnit: this.DistanceUnit};
    let myModal = this.modalCtrl.create(SettingModalPage, obj);

    myModal.onDidDismiss(data => {
        console.log('modal value: '+data.DistanceUnit)
        this.DistanceUnit = data.DistanceUnit;
        this.selectedRadious = data.selectedRadious;

        this.storage.set('distUnit', this.DistanceUnit);
        this.storage.set('SetRadious', this.selectedRadious);
    });
    myModal.present();
}

Если вы внимательно прочитаете код, вы узнаете, что я обработал все случаи для получения обоих параметров, и если один из них вышел из строя. Проверьте это и сообщите мне.

Ответ 4

У меня была эта проблема. Во-первых, вы должны увидеть это обновление.

В основном вам необходимо:

  • Удалите Storage из providers в app.module.ts
  • import { IonicStorageModule } from '@ionic/storage' вместо import { IonicStorage } from '@ionic/storage' в app.module.ts
  • Добавить IonicStorageModule.forRoot() в массив imports в app.module.ts

После этого, однако, у меня все еще была ошибка (не удается разрешить все параметры для Storage: (?)). Я узнал, что использовал Storage в качестве поставщика в компоненте. Вам нужно удалить его. См. Ниже:

@Component({
  selector: 'login',
  templateUrl: 'login.component.html',
  providers: [
    AuthService,
    // Storage, <-- you need to remove this
    JwtHelper
  ]
})

Ответ 5

В дополнение к ответу Suraj я обнаружил, что мне нужно явно создать объект Storage в конструкторе, передавая параметры, например.

	this.storage=new Storage({name:"__mydb"});

Ответ 6

Ответ от suraj привел к решающему решению.

У меня была та же проблема. В app.module.ts я указал оба параметра: import {IonicStorageModule} from '@ionic/storage'; и: import {Storage} from '@ionic/storage'. Когда я не смог решить проблему, я установил: npm install @ionic/storage. Я удалил: import {Storage} from '@ionic/storage' из app.module.ts и оставил только это: import {IonicStorageModule} from '@ionic/storage'; После этого проблема была исправлена.