在我的 Ionic2 (Angular2) 应用程序中,我有一个封装项目数组的数据服务,以及一个显示这些项目的页面,以及允许向其中添加更多项目的按钮。
export class Person {
constructor(private _name: string) { }
get name(): string { return this._name; }
}
@Injectable()
export class DataService {
private _persons: Person[] = [new Person('A'), new Person('B')];
get persons(): Person[] { return this._persons; }
}
@Page({
template: `
<ion-list>
<ion-item *ngFor="let person of dataService.persons">
{{person.name}}
</ion-item>
</ion-list>
<button (click)="onClickAdd()">Add</button>`,
})
export class MyPage {
constructor(private dataService: DataService) { }
onClickAdd() {
this.dataService.list.push(new Person('New Person'));
}
}
该列表在浏览器中呈现良好,列表操作也可以正常工作。但是,当我在手机上部署应用程序时,我开始面临以下问题:
列表呈现良好,但是当我从列表中添加/删除项目时,UI 不会更新。当我执行一些其他用户操作(在别处导航、单击按钮等)时,UI 会更新以显示更新后的列表。
我将重申,在浏览器中进行测试时我不会遇到这个问题。只有当我在我的 Android 设备上部署应用程序时才会发生这种情况。
我不知道为什么会发生这种情况,而且我不知道我可以尝试解决/解决这个问题。=(请帮忙!
编辑
进一步的测试表明 Ionic2 组件Alert
应该为此负责。更具体地说,我使用它的方式。该Alert
组件允许调用者.dismiss()
手动调用该方法以关闭对话框并返回一个在转换完成时解决的承诺。我正在修改此承诺回调中的列表。
onClickAdd() {
let dialog = Alert.create({
message: 'Are you sure you want to add a new person?',
buttons: [{
text: 'Yes',
handler: () => {
dialog.dismiss()
.then(() => navCtrl.pop)
.then(() => {
console.log('UPDATING...');
this.dataService.list.push(new Person('X'));
});
}
}]
});
navCtrl.present(alert);
}
我可以看到它UPDATING...
打印到控制台。但行为与以前相同。UI 会在浏览器中更新,但不会在设备中更新,除非执行了其他一些 UI 操作(例如单击按钮或在其他地方导航并返回)。
如果我删除Alert
逻辑并简单地在处理程序中添加新人onClickAdd()
,它在浏览器和设备中都可以正常工作。