D365 从另一个 JS 调用函数时出错

D365 Error when calling function from another JS

我在从另一个 JS 文件调用 JS 函数时遇到问题。

定义函数的主要JS。

var Common = Common || {};
Common.BaseAction = Common.BaseAction || {};

Common.BaseAction.SetNotification = function (message, level, uniqueId)
{
Xrm.Page.ui.setFormNotification(message, level, uniqueId);
}

Common.BaseAction.clearNotification = function (uniqueId) {
Xrm.Page.ui.clearFormNotification(uniqueId);
}

我调用函数的 JS

var apItem = apItem || {};
apItem.BaseForm = apItem.BaseForm || {};

apItem.BaseForm.SetName = function ()
{
var bookName = Xrm.Page.getAttribute("ap_bookid").getValue()[0].name;
var condition = Xrm.Page.getAttribute("ap_condition").getText();

if (bookName !== null && condition !== null) {
    Xrm.Page.getAttribute("ap_name").setValue(bookName + " - " + condition);
}
}

apItem.BaseForm.CountOverDueBy = function() {
var rentedTill = Xrm.Page.getAttribute("ap_rented_till").getValue();
var nowD = Date.now();

if (rentedTill !== null) {
    var overdueBy = parseInt((Date.now() - rentedTill) / 86400000);

    if (overdueBy > 0) {
        Xrm.Page.getAttribute("ap_overdue_by").setValue(overdueBy);
        Common.BaseAction.SetNotification("Book is Overdue by " + overdueBy 
+ " Days.", "WARNING", "OverDueWarning");
    }
    else {
        Xrm.Page.getAttribute("ap_overdue_by").setValue(null);
        Common.BaseAction.clearNotification("OverDueWarning");
    }
}
}

在实体的表单中,我添加了上面两个文件,其中 common.js 位于顶部,并且从事件处理程序中调用函数 apItem.BaseForm.CountOverDueBy

保存 + 发布并按 Ctrl + F5 给出以下错误

ReferenceError: Common is not defined
    at Object.apItem.BaseForm.CountOverDueBy (https://<domain>/%7B636651014350000438%7D/WebResources/ap_ItemFormBase.js?ver=2091450722:24:13)
    at eval (eval at RunHandlerInternal (https://<domain>/form/ClientApiWrapper.aspx?ver=2091450722:153:1), <anonymous>:1:17)
    at RunHandlerInternal (https://<domain>/form/ClientApiWrapper.aspx?ver=2091450722:159:1)
    at RunHandlers (https://<domain>/form/ClientApiWrapper.aspx?ver=2091450722:118:1)
    at OnScriptTagLoaded (https://<domain>/form/ClientApiWrapper.aspx?ver=2091450722:233:1)
    at https://<domain>/form/ClientApiWrapper.aspx?ver=2091450722:202:1

我已经尝试了所有方法,但似乎没有任何效果。

您在表格中注册 JS 文件的方式,从顶部的 common.js 开始,然后是 ap_ItemFormBase.js 应该可行。但是产品团队对脚本文件的性能改进很少,例如延迟脚本 loading/parallel 脚本加载。这有点棘手,现代脚本在 UUI 和 Web 等不同客户端之间很混乱。

Like explained in blog post,如果你将前提js设置为依赖,它会在你在依赖文件中使用它之前加载。

从解决方案(而不是从表单属性)打开 ap_ItemFormBase.js Web 资源,转到 Dependencies 选项卡并添加 common.js。这将确保文件在使用参考之前准备就绪。