2013-03-17 3 views
2

Я попытаюсь объяснить это как можно лучше, пожалуйста, не стесняйтесь просить разъяснений по мере необходимости.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, как ожидалось).

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 до тех пор, пока readyState внутреннего управления не будет complete?

ответ

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).

+0

Извинения за задержанный ответ. Хотя я могу абсолютно понять, что вы говорите, он производит ту же ошибку. Очень странно. – glosrob

0

Я попросил у моего CRM-приятеля. Он сказал, что проблема зависит от нового механизма обновления. По его словам, это своего рода ошибка, но на самом деле. Если я правильно понял, обновление было реинжинирингом, чтобы приспособить новую функцию непрерывного сохранения.