代理/覆盖 ServiceWorkerRegistration 函数的方法

问题描述

我正在尝试代理 ScreenManager: MainScreen: GroupScreen: <DialogContent>: textfield: textfield orientation: "vertical" spacing: "12dp" size_hint_y: None height: "120dp" MDTextField: id: textfield hint_text: "Group name" MDFlatButton: id: btn1 text: "Done" text_color: self.theme_cls.primary_color on_release: root.get_screen['main'].close_dialog() <MainScreen>: name: 'main' mdlist: mdlist FloatLayout: size_hint: 1,0.89 ScrollView: MDList: id: mdlist MDFloatingActionButton: pos_hint: {'right': 0.95,'y': 0.05} icon: "android" theme_text_color: "Custom" text_color: app.theme_cls.primary_color on_release: root.show_dialog() <GroupScreen>: name: 'group' MDLabel: text: 'Welcome' halign: 'center' MDRectangleFlatButton: text: 'Back' pos_hint: {'center_x': 0.5,'center_y': 0.3} on_release: root.manager.current = 'main' 对象的 showNotification 方法。这是我现在的做法:

ServiceWorkerRegistration

调用 function swNotificationCallback(title,opt) { console.log("title",title); console.log("options",opt); return true } function createSWHandler(original) { return (title,opt) => { if (swNotificationCallback(title,opt)) {return original(title,opt)} } } navigator.serviceWorker.getRegistrations().then(val => val.forEach(sw => { if (!sw._showNotification) { // backup the old just in case sw._showNotification = sw.showNotification; sw.showNotification = createSWHandler(sw.showNotification); } })); 正确记录所有内容,但未显示通知并抛出此错误sw.showNotification

有什么办法可以解决这个问题吗?我认为可以使用代理,但我不确定如何重新分配注册的服务工作者。

解决方法

您需要在实例上调用方法,而不是作为没有上下文的普通函数。使用call

function createSWHandler(original) {
    return function(title,opt) {
//         ^^^^^^^^
        if (swNotificationCallback(title,opt)) {
           return original.call(this,title,opt)
//                        ^^^^^^^^^^^
        }
    }
}

你也可以

createSWHandler(sw.showNotification.bind(sw))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...