我已在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);
}
}
答案 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;
}