我在我的ionic 3聊天应用程序中尝试使用import { SMS } from '@ionic-native/sms';
。但是document.removeEventListener('onSMSArrive');
无法正常工作。
以下是我正在使用的软件包
"@ionic-native/sms": "^4.3.0",
"@ionic-native/core": "^4.3.0",
"cordova-sms-plugin": "^0.1.11",
问题在于当我第一次进入页面时,它完美地工作并在手机接收短信时接收消息。但是,如果我返回到另一页,然后再回到该页,在我的函数中我会收到相同的消息两次。我认为事件监听器没有被删除,当我再次导航到页面时,另一个监听器被添加到文档中。
以下是我的代码:
当页面加载时,我添加事件监听器,当页面卸载时,我将其删除。
public ionViewWillEnter() {
this.smsService.startMessageListner();
}
public ionViewWillLeave() {
this.smsService.stopMessageListner();
}
这是我的服务中的startMessageListner()
和stopMessageListner()
函数。
public startMessageListner()
{
--- some works do here ---
this.startListner();
}
public startListner()
{
this.recieveMessage().then((message) => {
--- receives message here and when after
navigating multiple times I receives
multiple same messages here---
}
}
public recieveMessage() {
if (!window.SMS) { alert('SMS plugin not ready'); return; }
window.SMS.startWatch(function() {
console.log('Watching');
}, function() {
console.log('Not Watching');
});
this.promise = new Promise((resolve, reject) => {
document.addEventListener('onSMSArrive', this.resolveMessage(resolve));
});
return this.promise;
}
public stopMessageListner()
{
--- some works do here ---
this.stopReciveMessage();
}
public stopReciveMessage()
{
// ***This one also not works***
// document.removeEventListener('onSMSArrive', (event)=>{
// window.SMS.stopWatch(function() {
// console.log('Stop Watching');
// }, function() {
// console.log('Not Stop Watching');
// });
// });
document.removeEventListener('onSMSArrive');
window.SMS.stopWatch(function() {
console.log('Stop Watching');
}, function() {
console.log('Not Stop Watching');
});
}
请帮助我解决这个问题。这个问题浪费了我一整个星期,但是还没有解决。 :(
===更新评论===
所有给定的链接都说我必须在删除事件侦听器时传递完全相同的函数。在我的情况下,当我调用document.addEventListener
时,我使用this.resolveMessage(resolve)
和resolve
参数,所以我已经尝试过以下方法,但仍未解决。
public recieveMessage() { --same content as above-- let self = this; // I added this line for safe side this.promise = new Promise((resolve, reject) => { self.resolve = resolve; document.addEventListener('onSMSArrive', self.resolveMessage(resolve),false); }); return this.promise; } public stopReciveMessage() { document.removeEventListener('onSMSArrive', this.resolveMessage(this.resolve),false); window.SMS.stopWatch(function() { console.log('Stop Watching'); }, function() { console.log('Not Stop Watching'); }); }
2. 对于1中的recieveMessage()
,需要进行相同的操作。
public stopReciveMessage()
{
document.removeEventListener('onSMSArrive', this.resolveMessage,false);
window.SMS.stopWatch(function() {
console.log('Stop Watching');
}, function() {
console.log('Not Stop Watching');
});
}
3. 对于1中的recieveMessage()
,执行相同操作。
public stopReciveMessage()
{
let self = this;
this.promise = new Promise((resolve, reject) => {
document.removeEventListener('onSMSArrive', self.resolveMessage(resolve),false);
window.SMS.stopWatch(function() {
console.log('Stop Watching');
}, function() {
console.log('Not Stop Watching');
});
});
}
4. 对于1中的recieveMessage()
函数,都是相同的。
public stopReciveMessage()
{
let self = this;
this.promise = (resolve, reject) => {
document.removeEventListener('onSMSArrive', self.resolveMessage(resolve),false);
window.SMS.stopWatch(function() {
console.log('Stop Watching');
}, function() {
console.log('Not Stop Watching');
});
};
}
谢谢
stopRecieveMessage
方法?尝试在发送消息后立即使用this.promise.unsubscribe();
。 - OPVaddEventListener
中传递的函数的引用,以便稍后在removeEventListener
中传递它。例如,您可以执行this._listener = this.resolveMessage(resolve); document.addEventListener('onSMSArrive', this._listener);
然后document.removeEventListener('onSMSArrive', this._listener);
。 - Kaiido