Uncaught Error: Can't resolve all parameters for StorageService
Uncaught Error: Can't resolve all parameters for StorageService
我正在尝试在 ionic cordova 应用程序中实现 sql 存储。我按照这里的教程进行操作:https://ionicacademy.com/ionic-storage-crud-operations/
和这里的离子页面:https://ionicframework.com/docs/building/storage
我收到未捕获的错误:
Can't resolve all parameters for StorageService: (?).
at syntaxError (vendor.js:84831)
at CompileMetadataResolver._getDependenciesMetadata (vendor.js:100051)
at CompileMetadataResolver._getTypeMetadata (vendor.js:99886)
at CompileMetadataResolver._getInjectableMetadata (vendor.js:99866)
at CompileMetadataResolver.getProviderMetadata (vendor.js:100226)
at vendor.js:100137
at Array.forEach (<anonymous>)
at CompileMetadataResolver._getProvidersMetadata (vendor.js:100097)
at CompileMetadataResolver.getNgModuleMetadata (vendor.js:99665)
at JitCompiler._loadModules (vendor.js:118758)
我的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';
//**************** Added Modules
import { HttpModule } from '@angular/http';
import { HttpClientModule } from '@angular/common/http';
import { IonicStorageModule } from '@ionic/storage/';
import { InAppBrowser } from '@ionic-native/in-app-browser';
import { EmailComposer } from '@ionic-native/email-composer';
//**************** Created Pages
import { HomePage } from '../pages/home/home';
import { DemographicsPage } from '../pages/demographics/demographics';
import { AuthPage } from '../pages/auth/auth';
import { WeightPage } from '../pages/weight/weight';
//**************** Created Service
import { AuthService } from '../services/auth.service';
import { RefreshTokenService } from '../services/refreshToken.service';
import { FormEncoderService } from '../services/formEncoder.service';
import { DecodeLoinc } from '../services/decodeLoinc.service';
import { AddWeightPage } from '../pages/add-weight/add-weight';
import { StorageService } from '../services/storage.service';
@NgModule({
declarations: [
MyApp,
HomePage,
DemographicsPage,
AuthPage,
WeightPage,
AddWeightPage
],
imports: [
BrowserModule,
IonicModule.forRoot(MyApp),
HttpModule,
HttpClientModule,
IonicStorageModule.forRoot({})
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
HomePage,
DemographicsPage,
AuthPage,
WeightPage,
AddWeightPage
],
providers: [
StatusBar,
SplashScreen,
AuthService,
RefreshTokenService,
FormEncoderService,
StorageService,
DecodeLoinc,
InAppBrowser,
EmailComposer,
{ provide: ErrorHandler, useClass: IonicErrorHandler }
]
})
export class AppModule {}
和我的storage.service.ts
import { Storage } from '@ionic/storage';
export interface Item {
id: number;
weight: number;
}
const WEIGHTS_KEY = 'my-weights';
export class StorageService {
constructor(private storage: Storage) {}
//create
addItem(item: Item): Promise<any> {
return this.storage.get(WEIGHTS_KEY).then((items: Item[]) => {
if (items) {
items.push(item);
return this.storage.set(WEIGHTS_KEY, items);
} else {
return this.storage.set(WEIGHTS_KEY, [item]);
}
});
}
//read
getItems(): Promise<Item[]> {
return this.storage.get(WEIGHTS_KEY);
}
}
服务在这里实现:
import { Component } from '@angular/core';
import { ViewController, NavController } from 'ionic-angular';
import { NgForm } from '@angular/forms';
import { EmailComposer } from '@ionic-native/email-composer';
import { WeightPage } from '../weight/weight';
import { StorageService, Item } from '../../services/storage.service';
@Component({
selector: 'page-add-weight',
templateUrl: 'add-weight.html'
})
export class AddWeightPage {
private enteredWt: number;
private subject = 'New Patient Weight';
private body = '';
private to = 'mfhamid@cmh.edu';
emailed: boolean = false;
items: Item[] = [];
newItem: Item = <Item>{};
constructor(
private viewCrtl: ViewController,
private emailComposer: EmailComposer,
private navCtrl: NavController,
private storageService: StorageService
) {}
onAddWeight(form: NgForm) {
..........
}
saveWeight() {
this.newItem.id = new Date().getTime();
this.newItem.weight = this.enteredWt;
// var date = new Date().getTime().toString();
this.storageService.addItem(this.newItem).then(item => {
this.newItem = <Item>{};
});
}
EmailWeight() {
........
}
onClose() {
.........
}
}
我也试过按照离子页面配置数据库,但没有成功:
imports: [
IonicStorageModule.forRoot({
name: '__mydb',
driverOrder: ['indexeddb', 'sqlite', 'websql']
})
],
配置文件:
<?xml version='1.0' encoding='utf-8'?>
<widget id="io.ionic.starter" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>weaigheasy</name>
<description>An awesome Ionic/Cordova app.</description>
<author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
<content src="index.html" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<allow-intent href="http://localhost/*" />
<preference name="ScrollEnabled" value="false" />
<preference name="android-minSdkVersion" value="19" />
<preference name="BackupWebStorage" value="none" />
<preference name="SplashMaintainAspectRatio" value="true" />
<preference name="FadeSplashScreenDuration" value="300" />
<preference name="SplashShowOnlyFirstTime" value="false" />
<preference name="SplashScreen" value="screen" />
<preference name="SplashScreenDelay" value="3000" />
<platform name="android">
<allow-intent href="market:*" />
<icon density="ldpi" src="resources/android/icon/drawable-ldpi-icon.png" />
<icon density="mdpi" src="resources/android/icon/drawable-mdpi-icon.png" />
<icon density="hdpi" src="resources/android/icon/drawable-hdpi-icon.png" />
<icon density="xhdpi" src="resources/android/icon/drawable-xhdpi-icon.png" />
<icon density="xxhdpi" src="resources/android/icon/drawable-xxhdpi-icon.png" />
<icon density="xxxhdpi" src="resources/android/icon/drawable-xxxhdpi-icon.png" />
<splash density="land-ldpi" src="resources/android/splash/drawable-land-ldpi-screen.png" />
<splash density="land-mdpi" src="resources/android/splash/drawable-land-mdpi-screen.png" />
<splash density="land-hdpi" src="resources/android/splash/drawable-land-hdpi-screen.png" />
<splash density="land-xhdpi" src="resources/android/splash/drawable-land-xhdpi-screen.png" />
<splash density="land-xxhdpi" src="resources/android/splash/drawable-land-xxhdpi-screen.png" />
<splash density="land-xxxhdpi" src="resources/android/splash/drawable-land-xxxhdpi-screen.png" />
<splash density="port-ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
<splash density="port-mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
<splash density="port-hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
<splash density="port-xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
<splash density="port-xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
<splash density="port-xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
<icon height="57" src="resources/ios/icon/icon.png" width="57" />
<icon height="114" src="resources/ios/icon/icon@2x.png" width="114" />
<icon height="40" src="resources/ios/icon/icon-40.png" width="40" />
<icon height="80" src="resources/ios/icon/icon-40@2x.png" width="80" />
<icon height="120" src="resources/ios/icon/icon-40@3x.png" width="120" />
<icon height="50" src="resources/ios/icon/icon-50.png" width="50" />
<icon height="100" src="resources/ios/icon/icon-50@2x.png" width="100" />
<icon height="60" src="resources/ios/icon/icon-60.png" width="60" />
<icon height="120" src="resources/ios/icon/icon-60@2x.png" width="120" />
<icon height="180" src="resources/ios/icon/icon-60@3x.png" width="180" />
<icon height="72" src="resources/ios/icon/icon-72.png" width="72" />
<icon height="144" src="resources/ios/icon/icon-72@2x.png" width="144" />
<icon height="76" src="resources/ios/icon/icon-76.png" width="76" />
<icon height="152" src="resources/ios/icon/icon-76@2x.png" width="152" />
<icon height="167" src="resources/ios/icon/icon-83.5@2x.png" width="167" />
<icon height="29" src="resources/ios/icon/icon-small.png" width="29" />
<icon height="58" src="resources/ios/icon/icon-small@2x.png" width="58" />
<icon height="87" src="resources/ios/icon/icon-small@3x.png" width="87" />
<icon height="1024" src="resources/ios/icon/icon-1024.png" width="1024" />
<splash height="1136" src="resources/ios/splash/Default-568h@2x~iphone.png" width="640" />
<splash height="1334" src="resources/ios/splash/Default-667h.png" width="750" />
<splash height="2208" src="resources/ios/splash/Default-736h.png" width="1242" />
<splash height="1242" src="resources/ios/splash/Default-Landscape-736h.png" width="2208" />
<splash height="1536" src="resources/ios/splash/Default-Landscape@2x~ipad.png" width="2048" />
<splash height="2048" src="resources/ios/splash/Default-Landscape@~ipadpro.png" width="2732" />
<splash height="768" src="resources/ios/splash/Default-Landscape~ipad.png" width="1024" />
<splash height="2048" src="resources/ios/splash/Default-Portrait@2x~ipad.png" width="1536" />
<splash height="2732" src="resources/ios/splash/Default-Portrait@~ipadpro.png" width="2048" />
<splash height="1024" src="resources/ios/splash/Default-Portrait~ipad.png" width="768" />
<splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
<splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
<splash height="2732" src="resources/ios/splash/Default@2x~universal~anyany.png" width="2732" />
</platform>
<plugin name="cordova-plugin-whitelist" spec="1.3.3" />
<plugin name="cordova-plugin-statusbar" spec="2.4.2" />
<plugin name="cordova-plugin-device" spec="2.0.2" />
<plugin name="cordova-plugin-splashscreen" spec="5.0.2" />
<plugin name="cordova-plugin-ionic-keyboard" spec="^2.0.5" />
<plugin name="cordova-plugin-ionic-webview" spec="^4.0.0" />
<plugin name="cordova-plugin-inappbrowser" spec="3.0.0" />
<plugin name="cordova-plugin-email-composer" spec="0.9.2">
<variable name="ANDROID_SUPPORT_V4_VERSION" value="27.+" />
</plugin>
<plugin name="cordova-sqlite-storage" spec="3.2.0" />
<engine name="android" spec="7.1.4" />
</widget>
知道如何解决这个问题吗?
据我了解,对于存储,您无法将其注入另一个 service/provider。你应该能够做这样的事情而不是注入它:
export class StorageService {
private storage: Storage;
constructor() {
this.storage = new Storage(null); // or some StorageConfig instead of null
}
}
我正在尝试在 ionic cordova 应用程序中实现 sql 存储。我按照这里的教程进行操作:https://ionicacademy.com/ionic-storage-crud-operations/ 和这里的离子页面:https://ionicframework.com/docs/building/storage
我收到未捕获的错误:
Can't resolve all parameters for StorageService: (?).
at syntaxError (vendor.js:84831)
at CompileMetadataResolver._getDependenciesMetadata (vendor.js:100051)
at CompileMetadataResolver._getTypeMetadata (vendor.js:99886)
at CompileMetadataResolver._getInjectableMetadata (vendor.js:99866)
at CompileMetadataResolver.getProviderMetadata (vendor.js:100226)
at vendor.js:100137
at Array.forEach (<anonymous>)
at CompileMetadataResolver._getProvidersMetadata (vendor.js:100097)
at CompileMetadataResolver.getNgModuleMetadata (vendor.js:99665)
at JitCompiler._loadModules (vendor.js:118758)
我的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';
//**************** Added Modules
import { HttpModule } from '@angular/http';
import { HttpClientModule } from '@angular/common/http';
import { IonicStorageModule } from '@ionic/storage/';
import { InAppBrowser } from '@ionic-native/in-app-browser';
import { EmailComposer } from '@ionic-native/email-composer';
//**************** Created Pages
import { HomePage } from '../pages/home/home';
import { DemographicsPage } from '../pages/demographics/demographics';
import { AuthPage } from '../pages/auth/auth';
import { WeightPage } from '../pages/weight/weight';
//**************** Created Service
import { AuthService } from '../services/auth.service';
import { RefreshTokenService } from '../services/refreshToken.service';
import { FormEncoderService } from '../services/formEncoder.service';
import { DecodeLoinc } from '../services/decodeLoinc.service';
import { AddWeightPage } from '../pages/add-weight/add-weight';
import { StorageService } from '../services/storage.service';
@NgModule({
declarations: [
MyApp,
HomePage,
DemographicsPage,
AuthPage,
WeightPage,
AddWeightPage
],
imports: [
BrowserModule,
IonicModule.forRoot(MyApp),
HttpModule,
HttpClientModule,
IonicStorageModule.forRoot({})
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
HomePage,
DemographicsPage,
AuthPage,
WeightPage,
AddWeightPage
],
providers: [
StatusBar,
SplashScreen,
AuthService,
RefreshTokenService,
FormEncoderService,
StorageService,
DecodeLoinc,
InAppBrowser,
EmailComposer,
{ provide: ErrorHandler, useClass: IonicErrorHandler }
]
})
export class AppModule {}
和我的storage.service.ts
import { Storage } from '@ionic/storage';
export interface Item {
id: number;
weight: number;
}
const WEIGHTS_KEY = 'my-weights';
export class StorageService {
constructor(private storage: Storage) {}
//create
addItem(item: Item): Promise<any> {
return this.storage.get(WEIGHTS_KEY).then((items: Item[]) => {
if (items) {
items.push(item);
return this.storage.set(WEIGHTS_KEY, items);
} else {
return this.storage.set(WEIGHTS_KEY, [item]);
}
});
}
//read
getItems(): Promise<Item[]> {
return this.storage.get(WEIGHTS_KEY);
}
}
服务在这里实现:
import { Component } from '@angular/core';
import { ViewController, NavController } from 'ionic-angular';
import { NgForm } from '@angular/forms';
import { EmailComposer } from '@ionic-native/email-composer';
import { WeightPage } from '../weight/weight';
import { StorageService, Item } from '../../services/storage.service';
@Component({
selector: 'page-add-weight',
templateUrl: 'add-weight.html'
})
export class AddWeightPage {
private enteredWt: number;
private subject = 'New Patient Weight';
private body = '';
private to = 'mfhamid@cmh.edu';
emailed: boolean = false;
items: Item[] = [];
newItem: Item = <Item>{};
constructor(
private viewCrtl: ViewController,
private emailComposer: EmailComposer,
private navCtrl: NavController,
private storageService: StorageService
) {}
onAddWeight(form: NgForm) {
..........
}
saveWeight() {
this.newItem.id = new Date().getTime();
this.newItem.weight = this.enteredWt;
// var date = new Date().getTime().toString();
this.storageService.addItem(this.newItem).then(item => {
this.newItem = <Item>{};
});
}
EmailWeight() {
........
}
onClose() {
.........
}
}
我也试过按照离子页面配置数据库,但没有成功:
imports: [
IonicStorageModule.forRoot({
name: '__mydb',
driverOrder: ['indexeddb', 'sqlite', 'websql']
})
],
配置文件:
<?xml version='1.0' encoding='utf-8'?>
<widget id="io.ionic.starter" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>weaigheasy</name>
<description>An awesome Ionic/Cordova app.</description>
<author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
<content src="index.html" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<allow-intent href="http://localhost/*" />
<preference name="ScrollEnabled" value="false" />
<preference name="android-minSdkVersion" value="19" />
<preference name="BackupWebStorage" value="none" />
<preference name="SplashMaintainAspectRatio" value="true" />
<preference name="FadeSplashScreenDuration" value="300" />
<preference name="SplashShowOnlyFirstTime" value="false" />
<preference name="SplashScreen" value="screen" />
<preference name="SplashScreenDelay" value="3000" />
<platform name="android">
<allow-intent href="market:*" />
<icon density="ldpi" src="resources/android/icon/drawable-ldpi-icon.png" />
<icon density="mdpi" src="resources/android/icon/drawable-mdpi-icon.png" />
<icon density="hdpi" src="resources/android/icon/drawable-hdpi-icon.png" />
<icon density="xhdpi" src="resources/android/icon/drawable-xhdpi-icon.png" />
<icon density="xxhdpi" src="resources/android/icon/drawable-xxhdpi-icon.png" />
<icon density="xxxhdpi" src="resources/android/icon/drawable-xxxhdpi-icon.png" />
<splash density="land-ldpi" src="resources/android/splash/drawable-land-ldpi-screen.png" />
<splash density="land-mdpi" src="resources/android/splash/drawable-land-mdpi-screen.png" />
<splash density="land-hdpi" src="resources/android/splash/drawable-land-hdpi-screen.png" />
<splash density="land-xhdpi" src="resources/android/splash/drawable-land-xhdpi-screen.png" />
<splash density="land-xxhdpi" src="resources/android/splash/drawable-land-xxhdpi-screen.png" />
<splash density="land-xxxhdpi" src="resources/android/splash/drawable-land-xxxhdpi-screen.png" />
<splash density="port-ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
<splash density="port-mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
<splash density="port-hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
<splash density="port-xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
<splash density="port-xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
<splash density="port-xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
<icon height="57" src="resources/ios/icon/icon.png" width="57" />
<icon height="114" src="resources/ios/icon/icon@2x.png" width="114" />
<icon height="40" src="resources/ios/icon/icon-40.png" width="40" />
<icon height="80" src="resources/ios/icon/icon-40@2x.png" width="80" />
<icon height="120" src="resources/ios/icon/icon-40@3x.png" width="120" />
<icon height="50" src="resources/ios/icon/icon-50.png" width="50" />
<icon height="100" src="resources/ios/icon/icon-50@2x.png" width="100" />
<icon height="60" src="resources/ios/icon/icon-60.png" width="60" />
<icon height="120" src="resources/ios/icon/icon-60@2x.png" width="120" />
<icon height="180" src="resources/ios/icon/icon-60@3x.png" width="180" />
<icon height="72" src="resources/ios/icon/icon-72.png" width="72" />
<icon height="144" src="resources/ios/icon/icon-72@2x.png" width="144" />
<icon height="76" src="resources/ios/icon/icon-76.png" width="76" />
<icon height="152" src="resources/ios/icon/icon-76@2x.png" width="152" />
<icon height="167" src="resources/ios/icon/icon-83.5@2x.png" width="167" />
<icon height="29" src="resources/ios/icon/icon-small.png" width="29" />
<icon height="58" src="resources/ios/icon/icon-small@2x.png" width="58" />
<icon height="87" src="resources/ios/icon/icon-small@3x.png" width="87" />
<icon height="1024" src="resources/ios/icon/icon-1024.png" width="1024" />
<splash height="1136" src="resources/ios/splash/Default-568h@2x~iphone.png" width="640" />
<splash height="1334" src="resources/ios/splash/Default-667h.png" width="750" />
<splash height="2208" src="resources/ios/splash/Default-736h.png" width="1242" />
<splash height="1242" src="resources/ios/splash/Default-Landscape-736h.png" width="2208" />
<splash height="1536" src="resources/ios/splash/Default-Landscape@2x~ipad.png" width="2048" />
<splash height="2048" src="resources/ios/splash/Default-Landscape@~ipadpro.png" width="2732" />
<splash height="768" src="resources/ios/splash/Default-Landscape~ipad.png" width="1024" />
<splash height="2048" src="resources/ios/splash/Default-Portrait@2x~ipad.png" width="1536" />
<splash height="2732" src="resources/ios/splash/Default-Portrait@~ipadpro.png" width="2048" />
<splash height="1024" src="resources/ios/splash/Default-Portrait~ipad.png" width="768" />
<splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
<splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
<splash height="2732" src="resources/ios/splash/Default@2x~universal~anyany.png" width="2732" />
</platform>
<plugin name="cordova-plugin-whitelist" spec="1.3.3" />
<plugin name="cordova-plugin-statusbar" spec="2.4.2" />
<plugin name="cordova-plugin-device" spec="2.0.2" />
<plugin name="cordova-plugin-splashscreen" spec="5.0.2" />
<plugin name="cordova-plugin-ionic-keyboard" spec="^2.0.5" />
<plugin name="cordova-plugin-ionic-webview" spec="^4.0.0" />
<plugin name="cordova-plugin-inappbrowser" spec="3.0.0" />
<plugin name="cordova-plugin-email-composer" spec="0.9.2">
<variable name="ANDROID_SUPPORT_V4_VERSION" value="27.+" />
</plugin>
<plugin name="cordova-sqlite-storage" spec="3.2.0" />
<engine name="android" spec="7.1.4" />
</widget>
知道如何解决这个问题吗?
据我了解,对于存储,您无法将其注入另一个 service/provider。你应该能够做这样的事情而不是注入它:
export class StorageService {
private storage: Storage;
constructor() {
this.storage = new Storage(null); // or some StorageConfig instead of null
}
}