无法仅在实体的一种形式上显示自定义功能区按钮

时间:2015-05-26 03:09:33

标签: javascript dynamics-crm dynamics-crm-2013 microsoft-dynamics

我已在CRM 2013中的商机实体上创建了一个功能区按钮,并使用自定义启用规则仅在一个表单上显示该按钮(管理,销售)。

我能够在右侧窗体(admin)上看到Web上的按钮,但它似乎在Outlook客户端上不可见。我使用以下JavaScript来启用/禁用按钮,由于某种原因,从Outlook调用时,JS看起来总是返回false。

我正在使用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);
    }
}

1 个答案:

答案 0 :(得分: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;
}