SDK GridRefresh调用抛出异常

时间:2013-03-17 13:00:58

标签: javascript dynamics-crm-2011

我将尽力解释这一点,请随时根据要求提出澄清。

使用IE10,CRM Online和RU12。

我正在玩subgrids并让他们刷新。考虑以下脚本,我从MSDN批发(并包装在try / catch块中)

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]为空

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

2 个答案:

答案 0 :(得分:1)

您正在使用的代码块,

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的元素)。

答案 1 :(得分:0)

我问了一个我的CRM好友。他说这个问题取决于新的茶点引擎。据他说,这是一种错误,但不是真的。如果我做对了,刷新已经过重新设计,以适应新的永久保存功能。