Я добавил правило «Включить» с пользовательским правилом 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
функция для включения второго вызова.
Мой вопрос: это можно решить иначе?