javascript - SDK GridRefresh调用抛异常

标签 javascript dynamics-crm-2011

我将尽我所能解释这一点,如有需要,请随时要求澄清。

使用 IE10、CRM Online 和 RU12。

我正在研究子网格并让它们刷新。考虑以下脚本,我从 MSDN 中批量获取(并包装在 try/catch block 中)

function start() {
    try {
        var controls = Xrm.Page.ui.controls.get(isSubGrid);

        if (controls.length > 0) {

            var subGridNames = "";
            for (var i in controls) {
                controls[i].refresh();
                subGridNames += (" - " + controls[i].getName() + "\n");
            }
            alert("The following subgrids were refreshed: \n" + subGridNames);
        }
        else {
            alert("There are no subgrid controls on the current form.");
        }
    }
    catch (ex) {
        alert(ex);
    }
}

function isSubGrid (control)
{
    return control.getControlType() == "subgrid";
}

没什么特别的 - 获取类型为 subgrid 的所有控件(按预期返回 10 个元素)并对它们调用 refresh()

然而,这在第一次调用 refresh() 时一直失败。

异常细节相当简单

TypeError: Unable to get property 'Refresh' of undefined or null reference

这表明此时在循环中调用时 control[i] 为 null

for (var i in controls) {
    controls[i].refresh();//error thrown here - suggests controls[i] is null
    subGridNames += (" - " + controls[i].getName() + "\n");
}

但是我可以看到它不是 null(并且具有预期的方法 refresh)。

enter image description here

我可以使用 setInterval 让它工作

function waitAndThenRefresh(gridname) {
    var grid = Xrm.Page.ui.controls.get(gridname);
    var intervalId = setInterval(function () {
        if (grid === null || grid._control === null || grid._control._element === null) {
            return;
        }
        if (grid._control._element.readyState === 'complete') {
            window.clearInterval(intervalId);
            if (grid != null) {
                grid.refresh();
            }
        }
    }, 1000);
}

但这很可怕,更不用说没有解释 SDK 调用没有按预期工作。

所以我想问题是:还有其他人看到过这个问题吗?或者您可以在另一个实例上复制它吗?我错过了什么吗? SDK 中没有任何内容建议您需要推迟调用 refresh 直到内部控件的 readyStatecomplete?

最佳答案

你正在使用的代码块,

for (var i in controls) {
    controls[i].refresh();
    subGridNames += (" - " + controls[i].getName() + "\n");
}

应替换为以下内容:

for (var i in controls) {
    i.refresh();
    subGridNames += (" - " + i.getName() + "\n");
}

或:

for (var i = 0; i < controls.length; i++) {
    controls[i].refresh();
    subGridNames += (" - " + controls[i].getName() + "\n");
}

您遇到异常是因为 controls[i] 在您的情况下未定义,i 是控件(数组 controls 的元素>).

关于javascript - SDK GridRefresh调用抛异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15461003/

相关文章:

javascript - 如何在 date-fns 中跳过格式化中的某些字符

linq - 我可以使用 LINQ 更新联系人的所有者 ID 吗?

css - 来自功能区的 Dynamics CRM 2011 模式 Web 资源按钮大小不正确(仅限 IE)

css - Outlook 2010 渲染差异?

dynamics-crm - MS Dynamics CRM 2011 中的 SQL Server 错误

javascript - 如何从客户端将参数添加到 HttpContext.Request.Form 中

javascript - Three.js 渲染结果意外?

javascript - 如何像彩票一样抽出总是不同的数字?

javascript - 加载时淡入菜单项(有延迟)

dynamics-crm-2011 - 客户关系管理 2011 : Special permissions missing for Users