我在Ionic 4中有一个香烟计数器应用。这里是Stackblitz:https://stackblitz.com/edit/ionic-8xrdgo。当用户按下计数器段中的Add One按钮时,我需要在历史段中显示最新的消费数据。出于某种原因,需要重新加载应用程序才能在历史段中显示最新的数据。
为了重现这个问题:
consumption启动应用程序这里的问题是,重新加载应用程序是必要的,以更新现有消费到存储和显示它。
这里的完整代码:
home.page.html:
<ion-header>
<ion-toolbar>
<ion-segment [(ngModel)]="segment" color="dark">
<ion-segment-button value="info">
Info
</ion-segment-button>
<ion-segment-button value="counter">
Counter
</ion-segment-button>
<ion-segment-button value="history">
History
</ion-segment-button>
</ion-segment>
</ion-toolbar>
</ion-header>
<ion-content padding>
<div *ngIf="segment == 'info'">
<h1 class="center">Cigarette pack info</h1>
<ion-item>
<ion-input placeholder="Price" type="number" [(ngModel)]="pack.price"></ion-input>
</ion-item>
<ion-item>
<ion-input placeholder="Cigarette count" type="number" [(ngModel)]="pack.cigarettecount"></ion-input>
</ion-item>
<br>
<ion-button expand="block" color="dark" (click)="savePack()">Save</ion-button>
</div>
<div *ngIf="segment == 'counter'">
<h1 class="center">Consumption today</h1>
<p class="center">{{ today.date }}</p>
<p class="center">{{ today.consumption }}</p>
<p class="center">{{ today.last_smoked }}</p>
<ion-button expand="block" color="dark" (click)="addOne()">Add one</ion-button>
</div>
<div *ngIf="segment == 'history'">
<h1 class="center">Recent consumption</h1>
<ion-grid>
<ion-row>
<ion-col><b>Date</b></ion-col>
<ion-col><b>Consumption</b></ion-col>
</ion-row>
<ion-row *ngFor="let history of histories">
<ion-col>{{ history.date }}</ion-col>
<ion-col>{{ history.consumption }}</ion-col>
</ion-row>
<ion-row>
<ion-col>-{{ money_consumption_tostring }} €</ion-col>
</ion-row>
</ion-grid>
</div>
</ion-content>接口:
export interface pack {
price: number,
cigarettecount: number
}
export interface consumption {
date: string,
consumption: number,
last_smoked: string
}home.page.ts:
import { Component } from '@angular/core';
import { pack } from '../pack.interface';
import { consumption } from '../consumption.interface';
import { ConsumptionService } from '../consumption.service';
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
})
export class HomePage {
constructor(private service: ConsumptionService) { }
segment: string = "info";
pack: pack[] = [];
today = {} as consumption;
histories: consumption[] = [];
price: number = 0;
money_consumption: number = 0;
money_consumption_tostring: string = "0";
ngOnInit() {
this.service.getConsumptions().then((data: consumption[]) => {
if (data == null) {
this.today.consumption = 0;
this.today.date = new Date().toLocaleDateString();
this.today.last_smoked = new Date().toLocaleTimeString();
} else {
for (let consumption of data) {
if (consumption.date == new Date().toLocaleDateString()) {
this.today = consumption;
}
}
}
this.service.getConsumptions().then((data: consumption[]) => {
this.histories = data;
})
})
this.service.getPack().then((data) => {
if (data != null) {
this.segment = "counter";
}
})
}
addOne = () => {
this.today.date = new Date().toLocaleDateString();
this.today.consumption += 1;
this.today.last_smoked = new Date().toLocaleTimeString();
this.service.getConsumptions().then((data: consumption[]) => {
let consumptions = data;
// at least one consumption found
if (consumptions != null) {
let current_exists = false;
for (let consumption of consumptions) {
// use current date
if (consumption.date == this.today.date) {
current_exists = true;
consumption.date = this.today.date;
consumption.consumption = this.today.consumption;
consumption.last_smoked = this.today.last_smoked;
// add current consumption to history
for (let history of this.histories) {
if (history.date == this.today.date) {
history.date = this.today.date;
history.consumption = this.today.consumption;
history.last_smoked = this.today.last_smoked;
}
}
}
}
// new date
if (current_exists == false) {
consumptions.push(this.today);
this.histories.push(this.today);
}
this.service.saveConsumptions(consumptions);
} else {
// no consumptions found
this.service.addConsumptions(this.today);
this.histories = data;
}
})
}
savePack = () => {
this.service.savePack(this.pack);
this.segment = "counter";
}
}consumption.service.ts:
import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';
import { pack } from './pack.interface';
import { consumption } from './consumption.interface';
@Injectable({
providedIn: 'root'
})
export class ConsumptionService {
constructor(private storage: Storage) { }
getPack = () => {
return new Promise((resolve, reject) => {
this.storage.get("pack").then((pack) => {
resolve(pack);
})
})
}
savePack = (pack: pack[]) => {
this.storage.set("pack", pack);
}
getConsumptions = () => {
return new Promise((resolve, reject) => {
this.storage.get("consumption").then((kulutukset) => {
resolve(kulutukset);
})
})
}
addConsumptions = (newconsumption: consumption) => {
this.storage.get("consumption").then((data: consumption[]) => {
let consumptions = data;
let current_exists = false;
if (consumptions == null) {
consumptions = [{date: new Date().toLocaleDateString(),
consumption: 0, last_smoked: new Date().toLocaleTimeString()},
]
}
for (let consumption of consumptions) {
// use current date
if (consumption.date == newconsumption.date) {
current_exists = true;
consumption.date = newconsumption.date;
consumption.consumption = newconsumption.consumption;
consumption.last_smoked = newconsumption.last_smoked;
}
}
// new date
if (current_exists == false) {
consumptions.push(newconsumption);
}
this.storage.set("consumption", consumptions);
}
)}
saveConsumptions = (consumptions: consumption[]) => {
this.storage.set("consumption", consumptions);
}
}发布于 2019-01-31 09:34:26
在Ionic中理解页面/组件的生命周期是很重要的;
由于Ionic应用程序实际上将一个页面堆叠在另一个页面上,以便将移动应用程序的标准行为与后退按钮等匹配起来(在浏览器devtools中检查应用程序的结构并尝试打开多个页面),正确的方法是挂在Ionic生命周期上,因为每次加载视图、重新打开应用程序或导航到页面时,都会触发ionViewDidLoad或ionViewWillLoad;事件。
在这里阅读更多信息:https://blog.ionicframework.com/navigating-lifecycle-events/
发布于 2019-01-31 07:23:13
在构造函数(){}中可以这样做。
data = [];
constructor(private storage: Storage) {
//write your code
//for example:
this.storage.get("pack").then((pack) => {
this.data = pack;
})
}https://stackoverflow.com/questions/54454894
复制相似问题