从表单中托管的 Web 资源从上下文访问 Xrm.Page 删除



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

文档说从html Web资源访问表单上下文以使用父级。Xrm.Page。

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

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

这一假设与文档页面末尾发布的已关闭问题相呼应。

添加到表单的 HTML Web 资源不能使用由加载的 JavaScript 库定义的全局对象 但是,如果您查看上面页面上的问题,就会有人提出一个明显的问题: 为了防止功能上的差距,当目前唯一可用的受支持方法被弃用时,实体窗体中包含的 HTML Web 资源将如何访问窗体的上下文? 我们是否可以依靠"父级"的受支持的替代方案。Xrm.Page"到删除 Xrm.Page?

回复是使用 getContentWindow,并从表单的加载中注入它。 这仍然不是很好,因为不能保证 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 仍然有效?

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

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

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

如果您在 onLoad 中安装了 getContentWindow,并且您的 Web 资源位于"详细信息"选项卡中,则仅当单击"详细信息"选项卡时,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>

希望对您有所帮助!

相关内容

  • 没有找到相关文章

最新更新