22.09.2015, 21:12 | #1 |
Участник
|
Двойной вызов функции
Всем доброго вечера. Опять нуждаюсь в Вашем совете.
В срм 2013 и срм 2015 (не знаю как такое прошляпил) заметил такую особенность. Пример: onLoad = function(){ Xrm.Page.getAttribute(name).addOnChange(getNameValue); Xrm.Page.data.entity.addOnSave(saveFunction); } getNameValue = function(){ alert(Xrm.Page.getAttribute(name).getValue()); } saveFunction = function(){ alert("!!!!!!"); } И так, в чем вопрос. Я не вешаю каждую функцию на отдельное событие. Завешиваю только функцию onLoad на загрузку формы. Все остальные обработчики цепляются в самой функции. И все отлично работает, но вот на что наткнулся. Когда создаем новую запись, и сохраняем ее не закрывая , то выполняется функция saveFunction, что логично, но почему то после сохранения, повторно отрабатывает функция onLoad и завешивает по еще одному обработчику на поле "name" и на сохранение формы. Что приводит к двойному вызову функций (обеих) при дальнейшем изменении поля и сохранении формы. НО когда запись сразу закрыть (после первого сохранения) а потом открыть повторно, такого артефакта не наблюдается. Кто нибудь сталкивался с подобным??? Буду очень благодарен за совет, а то уж сегодня всю голову себе проел этим. Спасибо! |
|
23.09.2015, 16:44 | #2 |
Kostya Afendikov
|
Используйте FromType https://msdn.microsoft.com/en-us/lib...MK_getFormType
|
|
23.09.2015, 17:55 | #3 |
Участник
|
Это не решает проблему, это своего рода костыль. Да и это не самый лучший вариант. Нужно понять причину такого поведения и устранить.
Но за совет спасибо. |
|
24.09.2015, 09:17 | #4 |
Участник
|
можно на сейве сделать removeOnChange
можно запомнить флаг (как вариант тип формы) в глобальную переменную, и смотреть если поменялась не выполнять скрипты на онлоаде больше всего что двойной запуск появляется только на создании или на апдейти тоже есть ? Последний раз редактировалось spectr; 24.09.2015 в 09:19. |
|
24.09.2015, 10:06 | #5 |
Участник
|
Я сделал с помощью флага на сейве. Да так работает (скрепя душой).
removeOnChange тоже интересно, но как быть с функциями на сейве? Для атрибута это легко Xrm.Page.getAttribute(name).removeOnChange(getNameValue); А как отсюда убрать обработчик? Xrm.Page.data.entity.addOnSave(saveFunction); |
|
25.09.2015, 09:22 | #6 |
Участник
|
Код: OnSave Use the addOnSave and removeOnSave methods to add or remove event handlers to the save event |
|
|
За это сообщение автора поблагодарили: Karpa_S (1). |
25.09.2015, 15:29 | #7 |
Участник
|
Спасибо за полезную информацию. Но остановился пока на флаге.
|
|