我将尽我所能解释这一点,如有需要,请随时要求澄清。
使用 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
)。
我可以使用 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
?
最佳答案
你正在使用的代码块,
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/