У меня есть приложение 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);");
Я оставляю вопрос, поскольку считаю, что он может быть полезен для других, и не думаю, что это необходимо.