Я попытаюсь объяснить это как можно лучше, пожалуйста, не стесняйтесь просить разъяснений по мере необходимости.SDK GridRefresh Call Throwing Exception
Использование IE10, CRM Online с RU12.
Я играю с субгридами и получаю их для обновления. Рассмотрим следующий сценарий, который я порезал оптом от MSDN (и завернутое в Try/поймать блок)
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");
}
Однако я вижу, что это не является нулевым (и имеет метод 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
?
Извинения за задержанный ответ. Хотя я могу абсолютно понять, что вы говорите, он производит ту же ошибку. Очень странно. – glosrob