Javascript переменная область при добавлении функции в массив - PullRequest
1 голос
/ 03 мая 2020

Я использую TinyMCE 4 и пытаюсь создать динамическое меню c. Для этого я создаю массив пунктов меню, который включает функцию onclick. Меню отображается, но функция onclick не работает, потому что при построении массива значение, которое мне нужно передать функции, выходит за рамки - я считаю.

var MenuItems = [{"Id":"1","Name":"MenuItem 1"},{"Id":"2","Name":"MenuItem 2"}];

var Menu = [];
for (var i=0;i<MenuItems.length;i++)
{
    Menu.push({
        text: MenuItems[i].Name,
        onclick: function(){              
            alert(MenuItems[i].Id);
        }
    });
}

В объявлении onclick MenuItems [ я] .Id находится за пределами области - я верю.

Как я могу передать значения в функцию onclick.

Затем я передаю массив в плагин TinyMCE, но я не Не думаю, что это проблема с TinyMCE, но размещение этой части на случай, если есть лучший способ.

tinymce.PluginManager.add('myplugin', function(editor, url) {    
    editor.addButton('menu', {
        text: 'MyMenu',
        type: 'menubutton',
        icon: false,
        menu: Menu           
    });
});

1 Ответ

2 голосов
/ 03 мая 2020

MenuItems[] не будет доступно, когда будет выполнен обратный вызов для myplugin.

Это также будет означать, что однажды, onclick любого menuItem вызывается, он попытается получить доступ к MenuItems[].

Чтобы исправить это, можно изменить реализацию, например:

var MenuItems = [{"Id":"1","Name":"MenuItem 1"},{"Id":"2","Name":"MenuItem 2"}];

var Menu = [];
for (var i=0;i<MenuItems.length;i++)
{
    const id = MenuItems[i].Id;
    Menu.push({
        text: MenuItems[i].Name,
        onclick: function(){              
            alert(id);
        }
    });
}
...