Передача "это" в качестве контекста для модуля? - PullRequest
0 голосов
/ 05 июля 2019

Я не новичок, но Javascript все еще часто смущает меня. Может кто-нибудь сказать мне, если то, что я делаю ниже, "хорошо"?

В Electron код шаблона для настройки меню может быть очень длинным. У меня есть несколько меню в многооконном приложении, и я хотел переместить код шаблона меню из main.js в модуль.

Итак, я создал новый файл:

const MenuTemplates = require("./app/js/menu-templates.js");  

и назовите это так:

var mainMenu = Menu.buildFromTemplate(MenuTemplates.getMainMenuFullVersion());` 

Вот сокращенная версия шаблона меню:

exports.getTimelineMenuFullVersion = function () {
    return [
        {
            label: global.appName,
            submenu: [
                { label: 'About ' + global.appName, 
                  click: () => { showAboutWindow() } },

Вызов функций (например, showAboutWindow() выдает ошибку - и это меня удивило. Наверное, я думал, что, поскольку MenuTemplates загружен main.js, он будет иметь доступ к своим методам.

Для решения этой проблемы я попытался передать this в качестве контекста:

var mainMenu = Menu.buildFromTemplate(MenuTemplates.getMainMenuFullVersion(this));` 

exports.getTimelineMenuFullVersion = function (context) {
    return [
        {
            label: global.appName,
            submenu: [
                { label: 'About ' + global.appName, 
                  click: () => { context.showAboutWindow() } },

Это не сработало - теперь я в замешательстве.

1 Ответ

0 голосов
/ 05 июля 2019

в течение многих лет в ES5 я использовал jQuery.proxy() https://api.jquery.com/jQuery.proxy/

однако, с ES6 проблема определения объема должна быть решена за вас, жирная стрелка (=>) должна переопределить функцию для вас. Если я что-то упустил.

Лично я бы предпочел шаблон прокси вместо передачи контекста. Но еще лучше, если использовать более новый ES6 способ справиться с этим

Отчасти невозможно ответить точно, не увидев MenuTemplates. Если MenuTemplates загружает все его методы в глобальное пространство имен (window), то да, теоретически у вас будет доступ к ним где угодно.

Но я не думаю, что модуль, загруженный с require, обычно делает это, они обычно загружают только переменную в этот файл, который является значением по умолчанию (ищите export default MenuTemplates внутри app / js / menu-templates.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...