我添加了一个启用规则,其中包含自定义javascript规则,可在需要时隐藏功能区按钮。它工作正常,但它被调用了两次。
我添加了console.trace()
调用以查看堆栈跟踪是什么,并看到以下内容 - 您可以看到第二个调用正在进行刷新。
我做了另外几个测试,并最终发现导致第二次调用的原因是调用任何Xrm
实用程序函数(这样如果myButtonFunc
执行不< / em>包含这种调用,它不会被触发两次)。
第一个电话:
(anonymous function)
evaluate
InjectedScript._evaluateOn
InjectedScript._evaluateAndWrap
InjectedScript.evaluateOnCallFrame
myRibbonObj.myButtonFunc <-- my ribbon's button function
Mscrm.CommandHandler.$Bz_1
Mscrm.CommandHandler.$FU_1
Mscrm.CommandHandler.$By_1
Mscrm.CommandHandler.$FQ_1
Mscrm.CommandHandler.$Eb_1
Mscrm.CommandHandler.canHandleCommand
Mscrm.CommandData.isControlEnabled
Mscrm.CommandBarData.isControlEnabled
Mscrm.CommandBar.$7b
Mscrm.CommandBar.evaluateCommands
Mscrm.CommandBarBuilder.$BY_0
Mscrm.CommandBarBuilder.$BS_0
Mscrm.CommandBarBuilder.$EF_0
Mscrm.CommandBarBuilder.$Hg_0
Mscrm.CommandBarBuilder.buildCommandBar
Mscrm.RibbonManager.$Cg_3
$v_0
第二个电话:
(anonymous function)
evaluate
InjectedScript._evaluateOn
InjectedScript._evaluateAndWrap
InjectedScript.evaluateOnCallFrame
myRibbonObj.myButtonFunc <-- my ribbon's button function
Mscrm.CommandHandler.$Bz_1
Mscrm.CommandHandler.$FU_1
Mscrm.CommandHandler.$By_1
Mscrm.CommandHandler.$FQ_1
Mscrm.CommandHandler.$Eb_1
Mscrm.CommandHandler.canHandleCommand
Mscrm.CommandData.isControlEnabled
Mscrm.CommandBarData.isControlEnabled
Mscrm.CommandBar.$7b
Mscrm.CommandBar.evaluateCommands
Mscrm.CommandBar.refreshCommandBar
Mscrm.CommandBar.refresh
Mscrm.CommandBarBuilder.refreshCommandBar <-- note this refresh
Mscrm.RibbonManager.$Hl_3
Mscrm.RibbonManager.$Hm_3
Mscrm.RibbonManager.$Hr_3
(anonymous function)
显然,我希望函数执行一次。我尝试了建议的here:
var triggered = false;
function RibbonButtonClick() {
CallMyFunction();
}
function CallMyFunction() {
if (triggered == false) {
triggered = true;
// ... your function body follows ...
return false; // hide the button
}
}
但它不起作用 - 显然,根据第二次调用的返回值显示/隐藏按钮!
所以我尝试了相反的做法 - 在第二次调用时运行所需的逻辑:
function CallMyFunction() {
if (triggered == false) {
triggered = true;
var dummy = Xrm.Page.data.entity.getId();
} else {
// ... your function body follows ...
return false; // hide the button
}
}
但这确实很棘手 - 它需要对Xrm
函数进行虚拟调用以启用第二次调用。
我的问题:这可以解决吗?