Правило включения ленты вызывается дважды - PullRequest
0 голосов
/ 29 мая 2018

Я добавил правило «Включить» с пользовательским правилом JavaScript, чтобы при необходимости скрыть кнопку ленты.Он работает нормально, но вызывается дважды.

Я добавил вызов console.trace(), чтобы посмотреть, что такое трассировка стека, и увидел следующее - Вы видите, что второй вызов выполняет обновление.

Я провел еще несколько тестов и в итоге выяснил, что причиной второго вызова является вызов любой из Xrm служебных функций (так что если myButtonFunc выполнение не содержит этот видвызова, он не будет запущен дважды).

Первый вызов:

(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)

Очевидно, я хочу, чтобы функция выполнялась один раз.Я попробовал то, что предложено здесь :

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функция для включения второго вызова.

Мой вопрос: это можно решить иначе?

...