我将尽力解释这一点,请随时根据要求提出澄清。
使用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
符合预期)。
我可以使用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
,直到内部控件的readyState
为complete
?
答案 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好友。他说这个问题取决于新的茶点引擎。据他说,这是一种错误,但不是真的。如果我做对了,刷新已经过重新设计,以适应新的永久保存功能。