Доступ из контекста из WebResource, размещенного в форме Post Xrm.Page Removal
Каков наилучший подход к доступу к FormContext формы из WebResource, размещенного в форме?
В документах говорится, что доступ к контексту формы из html WebResource используется для использования parent.Xrm.Page.
Веб-ресурс HTML, добавленный в форму, не может использовать глобальные объекты, определенные библиотекой JavaScript, загруженной в форму. Веб-ресурс HTML может взаимодействовать с объектами Xrm.Page или Xrm.Utility внутри формы с помощью parent.Xrm.Page или parent.Xrm.Utility, но глобальные объекты, определенные скриптами формы, не будут доступны с помощью родительского объекта. Вы должны загрузить любые библиотеки, которые нужны веб-ресурсу HTML, в веб-ресурс HTML, чтобы они не зависели от скриптов, загруженных в форму.
Но Xrm.Page устарел и будет удален. Когда это произойдет, я предполагаю, что parent.Xrm.Page не будет работать и в этот момент времени.
Это предположение подтверждается закрытой проблемой, опубликованной в конце страницы документа.
Веб-ресурс HTML, добавленный в форму, не может использовать глобальные объекты, определенные загруженной библиотекой JavaScript. Но если вы посмотрите на проблемы на странице выше, кто-то задаст очевидный вопрос: чтобы предотвратить пробелы в функциональности, как HTML веб-ресурс, включенный в форму сущности, обращается к контексту формы, когда единственный поддерживаемый метод, доступный сегодня, устарел? Можем ли мы рассчитывать на наличие поддерживаемой альтернативы parent.Xrm.Page к моменту удаления Xrm.Page?
На что ответ заключается в использовании getContentWindow и внедрении его из загрузки формы. Это все еще не очень хорошо, потому что нет гарантии, что веб-ресурс закончит загрузку вовремя, чтобы принять указанное значение. Один разработчик даже прокомментировал это и опубликовал свою работу на странице документа getContentWindow.
function form_onload(executionContext) {
const formContext = executionContext.getFormContext();
const wrControl = formContext.getControl("new_myWebResource.htm");
if (wrControl) {
wrControl.getContentWindow().then(contentWindow => {
let numberOfCalls = 0;
let interval = setInterval(() => {
if (typeof contentWindow.setClientApiContext !== "undefined") {
clearInterval(interval);
contentWindow.setClientApiContext(Xrm, formContext);
}
else
//stop interval after 1 minute
if (++numberOfCalls > 600) {
clearInterval(interval);
throw new Error("Content Window failed to initialize.");
}
}, 100);
});
}
}
В настоящее время это лучший / рекомендуемый подход для того, чтобы заставить это работать, или parent.Xrm.Page по-прежнему будет работать, даже если Xrm.Page был удален?
1 ответ
Некоторое время я использую getContentWindow, и он ждет загрузки веб-ресурса.
Что эта функция делает в бэкэнде, так это извлекает контент из iframe, поэтому я твердо верю, что она ожидает загрузки contentWindow. Я думаю, что это contentWindow делает то же самое, что и обычное contentWindow в Iframe: https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/contentWindow.
Например, если у вас есть две вкладки, скажем: Общие и Подробности.
Если у вас есть в onLoad getContentWindow и у вас есть веб-ресурс на вкладке Details, getContentWindow будет загружаться только при щелчке на вкладке Details, поэтому он отображается как веб-ресурс.
function form_onload(executionContext) {
const formContext = executionContext.getFormContext();
const wrControl = formContext.getControl("new_myWebResource.htm");
if (wrControl) {
var contentWindow = await wrControl.getContentWindow();
contentWindow.CallTheFunctionInYourWebResource(Xrm,formContext,...params)
}
}
В вашем веб-ресурсе будет что-то вроде:
<html>...
<script>
function CallTheFunctionInYourWebResource(_xrm, _formContext) {
// Do whatever you need to do here
}
</script>
Надеюсь, это поможет!