Ionic 2 - 是否可以为navParams提供poptoRoot功能?

时间:2017-05-05 12:02:46

标签: angular typescript ionic2 ionic3

我想知道是否可以为navParams提供poptoRoot功能。他们讨论的内容Here对我不起作用。有没有解决方法?要在poptoRoot页面和当前页面之间共享数据吗?

1 个答案:

答案 0 :(得分:3)

我担心 popToRoot 只接受 NavOptions 类型的参数(与页面转换相关) ,所以你需要将数据发送回根页面:

使用 Events

您可以在根页面上订阅该事件,然后在子页面中发布该事件,并将该数据作为该事件的一部分发送。

import { Events } from 'ionic-angular';

// Child page: publish the event sending the data
constructor(public events: Events) {}

someMethod(data) {
  this.events.publish('data:modified', data);
}


// Root page: subscribe to the event to get the data
constructor(public events: Events) {
  events.subscribe('data:modified', (data) => {
    // Handle the data...
  });
}

使用共享服务

如果您需要发送的参数是一个简单的数字或数组,您可以使用共享服务在那里存储该数据,因此根页面可以从服务中读取它,子页面可以修改它从那里开始。

如果您需要在每次数据更改时执行某些逻辑,那么您可以使用Subject,如下所示:

@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: 'child-page',
    templateUrl: 'child-page.html'
})
export class ChildPage {

    constructor(private yourItemsService: YourItemsService) {}

    updateItems(data: any) { 
        // Use the service to modify the data, keeping everyone updated
        this.yourItemsService.changeItems(data);
    }

}

根页面可以订阅数据的更改,每次更改时都执行一些逻辑:

@Component({
    selector: 'root-page',
    templateUrl: 'root-page.html'
})
export class RootPage {

    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();
    }
}