JavaScript-функция Ваадина не получает аргументы из внешнего почтового сообщения - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть приложение Vaadin, встроенное как iframe в угловое приложение 2+, и я пытаюсь отправить сообщение:

Угловая сторона:

<iframe id="iframe1" [src]="iframeSource"></iframe>

public sendMessage() {
    const iframe: HTMLIFrameElement = document.getElementById('iframe1') as HTMLIFrameElement;
    iframe.contentWindow.postMessage('asdf', '*');
}

Сторона Vaadin:

JavaScript.getCurrent().addFunction("listen", new JavaScriptFunction() {
                @Override
                public void call(JsonArray arguments) {
                    Notification.show("Received call ");
                }
            });
JavaScript.getCurrent().execute("window.addEventListener('message', listen, false);");

Приложение Vaadin получает сообщение, но единственный аргумент, который он получает в "arguments", это {isTrusted: true}, а не 'asdf'.Я пробовал передавать массивы, json, stringified json, и это всегда так.

Дело в том, что если в Vaadin я использую простую функцию javascript вместо «JavaScriptFunction», то я могу правильно прочитать аргументы.Это прекрасно работает:

String string = "listen = function myFunction(p) {"
                    +"console.log('function called', p); alert(p);"
                +"}";

JavaScript.getCurrent().execute(string);
JavaScript.getCurrent().execute("window.addEventListener('message', listen, false);");

Я не знаю, что происходит под капотом или что я делаю неправильно, чтобы иметь такое поведение, и я не смог найти решение или обойти,Помогите!

РЕДАКТИРОВАТЬ: Как только я написал, я подумал о возможном обходном пути, и он действительно работает: если я вызываю функцию JavascriptFunction из простой функции, я могу передать параметры.Таким образом, параметр «JsonArray» будет содержать действительные аргументы:

JavaScript.getCurrent().addFunction("javaFunction", new JavaScriptFunction() {
    @Override
    public void call(JsonArray arguments) {
        Notification.show("Received call ");
    }
});

String listenFunction = "listen = function myFunction(p) {"
        +"console.log('myFunction', p); javaFunction(p.data);"
    +"}";
JavaScript.getCurrent().execute(listenFunction);
JavaScript.getCurrent().execute("window.addEventListener('message', listen, false);");

Я оставляю вопрос, поскольку считаю, что он может быть полезен для других, и не думаю, что это необходимо.

...