从表单上托管的 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 仍然可以工作?