离子 - 通知页面已更改的最佳方法是什么



假设我们有一个页面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方法获取新数据。您还可以说数据已缓存,因此没有不必要的数据库查询。

相关内容

  • 没有找到相关文章

最新更新