假设我们有一个页面ListItemPage
显示项目列表:
-
在TS文件中,我们有一个变量
items: any = [];
-
在HTML文件中,我们有
<ion-item *ngFor="let item of items">
用户可以单击一个( )按钮以按下另一页AddItemPage
,他将在该页面上创建一个新项目。单击"保存"时,新项目将保存在数据库中(通过服务)并弹出页面。
通知ListItemPage
的最佳/惯用方法是什么?
items
变量?我应该使用事件吗?https://ionicframework.com/docs/api/util/events/
我应该使用可观察的吗?
其他东西?
什么是通知ListItempage的最佳/通常的方法 变量应更新?
- 我应该使用事件吗?https://ionicframework.com/docs/api/util/events/
- 我应该使用可观察的吗?
好吧,如果您已经拥有与项目相关的服务(也许是从后端获取项目的服务),则最好使用可观察到的东西来保持所有内容一致。<<<<<<<<<</p>
@Injectable()
export class YourItemsService {
public onItemsChange: Subject<any> = new Subject<any>();
// ...
public changeItems(someParam: any): void {
// ...
// Send the new data to the subscribers
this.onItemsChange.next(newItems);
}
}
这样,每个页面都可以订阅并在数据更改时进行更新,并且可以使用相同的服务来更改数据,知道更改也将传播到已订阅的所有页面:
@Component({
selector: 'another-page',
templateUrl: 'another-page.html'
})
export class AnotherPagePage {
constructor(private yourItemsService: YourItemsService) {}
updateItems(data: any) {
// Use the service to modify the data, keeping everyone updated
this.yourItemsService.changeItems(data);
}
}
和...
@Component({
selector: 'some-page',
templateUrl: 'some-page.html'
})
export class SomePagePage {
private itemsChangeSubscription: Subscription;
constructor(private yourItemsService: YourItemsService) {
// Subscribe to changes in the items
this.itemsChangeSubscription = this.yourItemsService.onItemsChange.subscribe(data => {
// Update the data of the page...
// ...
});
}
ionViewWillUnload() {
// Clear the itemsChangeSubscription
this.itemsChangeSubscription && this.itemsChangeSubscription.unsubscribe();
}
}
为什么要这样做?如果您需要每次修改项目(例如在另一个服务或任何其他属性中更新总金额)执行一些逻辑,则可以在服务中执行此操作,并将该逻辑集中在一个地方。因此,每个页面都应担心如何处理新数据以更新其当前状态,但是其他任何更改都将由服务
处理由于某种原因您不想使用可观察到的(您没有集中式服务,并且仅为单个事件创建新的服务听起来都不是一个好主意),则可以只使用离子事件。
如果您执行此操作,并且需要在每次发布事件时执行一些自定义逻辑,则需要在每个事件订阅的每个页面上重复该代码。
有关离子事件的其他详细信息
如果您查看Ionic事件的实现(源代码),您会看到内部离子不使用可观察到的,而是使用可观察到的数组,其中存储回调以在时执行该活动已发布
uf艰难。这似乎是一个"取决于"的问题,所以没有详细描述您的需求,恐怕不可能回答什么是最好的。
因此,这里是另一种方式更新items
。
用数据获取逻辑实现ionViewWillEnter()
方法(有关导航 - lifecycle-evest)。
每当要显示一个页面时,此方法都会发射,例如当它即将变得活跃时。因此,通过实施这样的事情:
ionViewWillEnter() {
this.dataService.getItems()
.then(result => {
this.items = result;
})
.catch(err => {
console.log(err);
});
});
}
和您的dataService
:
let _items = [];
public getItems() {
return new Promise ((resolve, reject) => {
if(!this._items || this._items.lenght == 0) {
// this._items = Read items from DB / web service ...
}
resolve(this._items);
});
}
public addItem(item: any) {
this._items.push(item);
// update db..
}
页面每次显示时都会有新的数据。
通过调用addItem
方法更新数据时,请确保以下所有调用getItems
方法获取新数据。您还可以说数据已缓存,因此没有不必要的数据库查询。