我遵循了this tutorial,它概述了在Ionic 2应用程序中添加监视信标的过程。我的工作非常好:加载视图时,它会初始化并开始监听信标:
home.ts
ionViewDidLoad() {
this.platform.ready().then(() => {
this.beaconProvider.initialise().then((isInitialised) => {
if (isInitialised) {
this.listenToBeaconEvents();
}
});
});
}
这会调用
listenToBeaconEvents
函数,该函数会在视图中填充所有信标:home.ts
listenToBeaconEvents() {
this.events.subscribe(‘didRangeBeaconsInRegion’, (data) => {
// update the UI with the beacon list
this.zone.run(() => {
this.beacons = [];
let beaconList = data.beacons;
beaconList.forEach((beacon) => {
let beaconObject = new BeaconModel(beacon);
this.beacons.push(beaconObject);
});
});
});
}
我可以使用
this.beaconProvider.stopRanging()
停止测距,该函数从以下函数调用一个函数:信标提供者
stopRanging() {
if (this.platform.is('cordova')) {
// stop ranging
this.ibeacon.stopRangingBeaconsInRegion(this.region)
.then(
() => {
console.log('Stopped Ranging');
},
error => {
console.error('Failed to stop monitoring: ', error);
}
);
}
}
我遇到的问题是-在原始教程中,信标列表显示在根目录中,没有其他导航。我将其移至另一个视图,如果用户退出并重新进入该视图,它将重新初始化并加载所有内容,从而导致重复的列表条目。
我尝试过在beacon-provider.ts中创建一个在视图退出之前调用的函数,但是我无法弄清楚如何防止订阅/事件重复。
我尝试了
this.delegate.didRangeBeaconsInRegion().unsubscribe()
和其他一些变体,但是它们都导致运行时错误。 最佳答案
在您的情况下,您使用的是Ionic的Events API,它具有自己的unsubscribe(topic, handler)
函数。
在组件中,每当需要取消订阅时,都应使用相同的主题进行调用:
this.events.unsubscribe(‘didRangeBeaconsInRegion’);
这将删除您可能已经为
didRangeBeaconsInRegion
注册的所有处理程序。如果要取消订阅某个特定功能,则必须已经注册了一个命名处理程序,可以通过取消订阅发送该处理程序。
this.events.unsubscribe(‘didRangeBeaconsInRegion’,this.mySubscribedHandler);
您的home.ts看起来像:
mySubscribedHandler:any = (data) => {
// update the UI with the beacon list
this.zone.run(() => {
this.beacons = [];
let beaconList = data.beacons;
beaconList.forEach((beacon) => {
let beaconObject = new BeaconModel(beacon);
this.beacons.push(beaconObject);
});
});
}
listenToBeaconEvents() {
this.events.subscribe(‘didRangeBeaconsInRegion’,this.mySubscribedHandler);
}
关于ionic-framework - Ionic2:取消订阅事件以避免重复的条目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43860110/