Доступ из контекста из 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>

Надеюсь, это поможет!

Другие вопросы по тегам