功能区启用规则被调用两次

时间:2018-05-29 15:36:47

标签: dynamics-crm dynamics-crm-2015

我添加了一个启用规则,其中包含自定义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函数进行虚拟调用以启用第二次调用。

我的问题:这可以解决吗?

0 个答案:

没有答案