Sunday, May 19, 2024
 Popular · Latest · Hot · Upcoming
55
rated 0 times [  62] [ 7]  / answers: 1 / hits: 41615  / 7 Years ago, mon, april 17, 2017, 12:00:00

After reading everything I could find, and failing, I must ask here:



I am trying to use ionic2's Storage, just like the doc tells me to,



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



here is my Code:



app-module.ts



    import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';

import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { Intro } from '../pages/intro/intro';
import { Checklist } from '../pages/checklist/checklist';
// import { Http } from '@angular/http';
import {IonicStorageModule} from '@ionic/Storage';
import { Data } from '../providers/data';
import {HttpModule} from '@angular/http';
// import {Storage} from '@ionic/storage';


@NgModule({
declarations: [
MyApp,
HomePage,
Intro,
Checklist
],
imports: [
HttpModule,
BrowserModule,
IonicModule.forRoot(MyApp),
IonicStorageModule.forRoot()
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
HomePage,
Intro,
Checklist
],
providers: [
StatusBar,
SplashScreen,
{provide: ErrorHandler, useClass: IonicErrorHandler},
// Storage,
//Http,
Data
],
})
export class AppModule {}


data.ts

import { Injectable } from '@angular/core';
// import { Http } from '@angular/http';
import 'rxjs/add/operator/map';
// import { HttpModule } from '@angular/http';

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


@Injectable()
export class Data {
constructor(public storage: Storage) {
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
getData(): Promise<any> {
return this.storage.get('checklists');
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
save(data): void {
let saveData = [];
//Remove observables
data.forEach((checklist) => {
saveData.push({
title: checklist.title,
items: checklist.items
});
});
let newData = JSON.stringify(saveData);
this.storage.set('checklists', newData);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}


home.ts



// import { Component } from '@angular/core';
// import { NavController } from 'ionic-angular';

// @Component({
// selector: 'page-home',
// templateUrl: 'home.html'
// })
// export class HomePage {

// constructor(public navCtrl: NavController) {

// }

// }


import { Component } from '@angular/core';
import { NavController, AlertController, Platform } from 'ionic-angular';
import { Checklist } from '../checklist/checklist';
import { ChecklistModel } from '../../models/checklist-model';
import { Data } from '../../providers/data';
import { Keyboard } from 'ionic-native';
@Component({
selector: 'page-home',
templateUrl: 'home.html',
})
export class HomePage {
checklists: ChecklistModel[] = [];

constructor(public navCtrl: NavController, public dataService: Data,
public alertCtrl: AlertController, public platform: Platform) {
}

// constructor(public navCtrl: NavController, public alertCtrl: AlertController, public platform: Platform) {
// // this.checklists.push(new ChecklistModel(Noam, [1,2,3]));
// }
///////////////////////////////////////////////////////////////////////////////////////////////////////////
ionViewDidLoad() {
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
addChecklist(): void {
let prompt = this.alertCtrl.create({
title: 'New Checklist',
message: 'Enter the name of your new checklist below:',
inputs: [
{
name: 'name'
}
],
buttons: [
{
text: 'Cancel'
},
{
text: 'Save',
handler: data => {
let newChecklist = new ChecklistModel(data.name, []);
this.checklists.push(newChecklist);
newChecklist.checklistUpdates().subscribe(update => {
this.save();
});
this.save();
}
}
]
});
prompt.present();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
renameChecklist(checklist): void {
let prompt = this.alertCtrl.create({
title: 'Rename Checklist',

message: 'Enter the new name of this checklist below:',
inputs: [
{
name: 'name'
}
],
buttons: [
{
text: 'Cancel'
},
{
text: 'Save',
handler: data => {
let index = this.checklists.indexOf(checklist);
if (index > -1) {
this.checklists[index].setTitle(data.name);
this.save();
}
}
}
]
});
prompt.present();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
viewChecklist(checklist): void {
this.navCtrl.push(Checklist, {
checklist: checklist
});
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
removeChecklist(checklist): void {
let index = this.checklists.indexOf(checklist);
if (index > -1) {
this.checklists.splice(index, 1);
this.save();
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
save(): void {
Keyboard.close();
this.dataService.save(this.checklists);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
}


The method that is supposed to get called and use the Storage is HomePage's save().



I can't get that far, however, because before the page even loads, I get




Runtime Error Uncaught (in promise): Error: No provider for Storage!
Error at g (http://localhost:8100/build/polyfills.js:3:7133) at
injectionError (http://localhost:8100/build/main.js:1585:86) at
noProviderError (http://localhost:8100/build/main.js:1623:12) at
ReflectiveInjector_.throwOrNull
(http://localhost:8100/build/main.js:3125:19) at
ReflectiveInjector
.getByKeyDefault
(http://localhost:8100/build/main.js:3164:25) at
ReflectiveInjector
.getByKey
(http://localhost:8100/build/main.js:3096:25) at
ReflectiveInjector
.get (http://localhost:8100/build/main.js:2965:21)
at AppModuleInjector.get (ng:///AppModule/module.ngfactory.js:254:82)
at AppModuleInjector.getInternal
(ng:///AppModule/module.ngfactory.js:481:44) at
AppModuleInjector.NgModuleInjector.get
(http://localhost:8100/build/main.js:3929:44) at resolveDep
(http://localhost:8100/build/main.js:11334:45) at createClass
(http://localhost:8100/build/main.js:11202:32) at
createDirectiveInstance (http://localhost:8100/build/main.js:11028:37)
at createViewNodes (http://localhost:8100/build/main.js:12377:49) at
createRootView (http://localhost:8100/build/main.js:12282:5)




Package.json:



{
name: ionic-hello-world,
author: Ionic Framework,
homepage: http://ionicframework.com/,
private: true,
config: {
ionic_source_map: source-map
},
scripts: {
clean: ionic-app-scripts clean,
build: ionic-app-scripts build,
ionic:build: ionic-app-scripts build,
ionic:serve: ionic-app-scripts serve
},
dependencies: {
@angular/common: 4.0.0,
@angular/compiler: 4.0.0,
@angular/compiler-cli: 4.0.0,
@angular/core: 4.0.0,
@angular/forms: 4.0.0,
@angular/http: 4.0.0,
@angular/platform-browser: 4.0.0,
@angular/platform-browser-dynamic: 4.0.0,
@ionic-native/core: 3.4.2,
@ionic-native/splash-screen: 3.4.2,
@ionic-native/status-bar: 3.4.2,
@ionic/storage: ^2.0.1,
ionic-angular: 3.0.1,
ionic-native: ^2.9.0,
ionicons: 3.0.0,
rxjs: 5.1.1,
sw-toolbox: 3.4.0,
zone.js: ^0.8.4
},
devDependencies: {
@ionic/app-scripts: 1.3.0,
typescript: ~2.2.1,
webpack: ^2.4.1
},
cordovaPlugins: [
cordova-plugin-whitelist,
cordova-plugin-console,
cordova-plugin-statusbar,
cordova-plugin-device,
cordova-plugin-splashscreen,
ionic-plugin-keyboard
],
cordovaPlatforms: [],
description: quicklists: An Ionic project
}


Since I did everything the doc said, please enlighten me - What is still missing that would cause the Storage not to be found



Thanks


More From » cordova

 Answers
18

EDIT


This answer used to get a lot of upvotes, and that stopped.


I can only assume this is due to version updates/bug fixes.


I suggest you update your angular before going forward with this solution.




Firstly you need to install: npm install --save @ionic/storage


The problem was in app.ts:


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

Capital 'S' instead of non capital 's':


from '@ionic/Storage'

instead of:


from '@ionic/storage'

No idea why the compiler wouldn't catch that if it's a problem, but it didn't.


Thanks to @chairmanmow


[#58119] Friday, April 14, 2017, 7 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
deonkalvinw

Total Points: 409
Total Questions: 96
Total Answers: 89

Location: Saint Pierre and Miquelon
Member since Sun, Nov 27, 2022
2 Years ago
deonkalvinw questions
Sun, Feb 6, 22, 00:00, 2 Years ago
Tue, Dec 28, 21, 00:00, 2 Years ago
Sun, Aug 22, 21, 00:00, 3 Years ago
Sun, Mar 7, 21, 00:00, 3 Years ago
;