4

Я создал кнопку ленты на объекте возможностей в CRM 2013 и использовала настраиваемое правило разрешения для отображения кнопки только в одной форме из двух доступных (admin , продажи).Невозможно отобразить пользовательскую ленточную кнопку только в одной форме объекта

Я могу видеть кнопку в Интернете в правильной форме (admin), но она не кажется видимой на клиенте Outlook. Я использую следующий JavaScript для включения/выключения кнопки, и по какой-то причине похоже, что JS всегда возвращает false при вызове из Outlook.

Я использую SetTimeout, поскольку Outlook, кажется, требует времени, чтобы получить объекты и выбросить ошибку, если это не используется.

Есть ли лучший способ включить кнопку на одной форме, а не на другую?

function EnableRibbonButton() 
{ 
    var client = Xrm.Page.context.client.getClient(); 
    if(client == "Web") 
    { 
     var form = Xrm.Page.ui.formSelector; 
     if(form != null) 
     { 
      var formItem = form.getCurrentItem(); 
      if(formItem != null) 
      { 
       var formId = formItem.getId(); 
       if(formId == "ADMINFORMGUID") 
       { 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 
     } 
    } 
    else if(client == "Outlook") 
    { 
     var form = getForms(); 
     var formItem = getFormItem(form); 
     var formId = getFormID(formItem); 
     if(formId == "ADMINFORMGUID") 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

function getForms() 
{ 
    var form = Xrm.Page.ui.formSelector; 
    if(form != null) 
    { 
     return form; 
    } 
    else 
    { 
     window.setTimeout("getForms()", 100); 
    } 
} 

function getFormItem(form) 
{ 
    var formItem = form.getCurrentItem(); 
    if(formItem != null) 
    { 
     return formItem; 
    } 
    else 
    { 
     window.setTimeout("getFormItem("+form+")", 100); 
    } 
} 
function getFormID(formItem) 
{ 
    var formId = formItem.getId(); 
    if(formId != null) 
    { 
     return formId; 
    } 
    else 
    { 
     window.setTimeout("getFormID("+formItem+")", 100); 
    } 
} 
+0

Привет, Microsoft хорошо известно об этой проблеме в перспективе. Для вашего случая я считаю, что это лучшее решение. – minohimself

ответ

0

setTimeout немедленно возвращает (в timeoutID) и будет исполнять первый аргумент в более позднее время, так что вам нужно какое-то механизм обратного вызова, чтобы перейти к следующему шагу.

Кроме того, давая setTimeout, строка в качестве первого аргумента является формой «неявного eval», что обычно нежелательно.

Пример getForm с обратным вызовом:

function getFormSelector(callback) { 
    var formSelector = Xrm.Page.ui.formSelector; 

    if(typeof callback === 'function') { 

     if(!formSelector) { 
      window.setTimeout(
       // Create closure for callback function. 
       function() { 
        getFormSelector(callback); 
       }, 
       100 // milliseconds 
      ); 
      return; 
     } 

     callback(formSelector); 
     return; 
    } 

    return formSelector; 
} 
Смежные вопросы