3

从表单上托管的 WebResource 访问表单的 FormContext 的最佳方法是什么?

文档说要从 html WebResource 访问表单上下文以使用 parent.Xrm.Page

添加到表单的 HTML Web 资源不能使用表单中加载的 JavaScript 库定义的全局对象。HTML Web 资源可以通过使用 parent.Xrm.Page 或 parent.Xrm.Utility 与表单中的 Xrm.Page 或 Xrm.Utility 对象进行交互,但使用父级无法访问由表单脚本定义的全局对象。您应该在 HTML Web 资源中加载 HTML Web 资源所需的任何库,以便它们不依赖于表单中加载的脚本。

但是 Xrm.Page 已被弃用,并将被删除。当它发生时,我的假设是 parent.Xrm.Page 在那个时间点也将无法工作。

这个假设得到了文档页面末尾发布的已关闭问题的回应。

添加到表单的 HTML Web 资源不能使用加载的 JavaScript 库定义的全局对象 但是如果您查看上面页面上的问题,有人会问一个明显的问题:为了防止功能上的差距,HTML 如何实体表单中包含的 Web 资源访问表单的上下文,当今天唯一支持的方法被弃用时?在删除 Xrm.Page 时,我们能否依赖“parent.Xrm.Page”的支持替代方案?

回复是使用getContentWindow,并从表单的 onload 中将其注入。这仍然不是很好,因为无法保证 Web 资源将及时完成加载以能够接受所述值。一位开发人员甚至发表了这样的评论,并在 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);
        });
    }
}

这是目前使其工作的最佳/推荐方法,还是即使 Xrm.Page 已被删除, parent.Xrm.Page 仍然可以工作?

4

1 回答 1

2

我使用 getContentWindow 已经有一段时间了,它确实在等待 Web 资源加载。

这个函数在后端所做的是从 iframe 中检索内容,所以我坚信它会等待 contentWindow 被加载。我的想法是这个 contentWindow 与 iframe 的常见 contentWindow 完全相同:https ://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/contentWindow

例如,如果您有两个选项卡,假设:常规和详细信息。

如果您在 onLoad 中有 getContentWindow,并且在 Details 选项卡中有 Web 资源,则只有在单击 Details 选项卡时才会加载 getContentWindow,因此它会呈现 Web 资源。

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>

希望能帮助到你!

于 2020-05-21T06:47:48.187 回答