Отследить нажатие Enter в текстовом поле, для вызова своего метода. BpmOnline 7.5.
Здравствуйте.
Подскажите, как использовать события нажатия кнопок в текстовом поле.
Объявлено текстовое поле:
{
"operation": "insert",
"parentName": "Header",
"propertyName": "items",
"name": "Surname",
"values": {
"layout": { "column": 0, "row": 0, "colSpan": 7},
"bindTo": "Cyr_Surname",
"contentType": Terrasoft.ContentType.TEXT,
"caption": {"bindTo": "Resources.Strings.Cir_SurnameCaption"}
}
}
attributes: {
"Surname": {
dataValueType: Terrasoft.DataValueType.TEXT
}
}
Как обратиться к событиям OnKeyUp, OnKeyDown? В итоге должно получиться: Пользователь вводит текст, нажимает Enter, выполняется моя функция.
Нравится
Олег, если правильно понимаю, то вот здесь - http://www.community.terrasoft.ru/forum/topic/11415 подобное уже обсуждалось.
Здравствуйте, Илья.
Сделал как сказано в указанной ссылке. Выходит ошибка в консоль: "TypeError: a.target is null" И соответственно не работает.
Вот, что написал:
init: { var map = new Ext.util.KeyMap({ target: "RIBClientSearchPageCyr_SurnameTextEdit-el", key: 13, // or Ext.EventObject.ENTER scope: this, binding: map, fn: this.OnMyPressEnter }); this.callParent(arguments); } onMyPressEnter: function(args) { this.showInformationDialog("Test"); if (this.keyMap) { this.keyMap.destroy(); this.keyMap = null; } },
Подскажите, что не так. Спасибо.
На момент начала события init, Ext компоненты(текстовое поле) еще нет, делайте так:
onEntityInitialized: function() { this.callParent(arguments); var map = new Ext.util.KeyMap({ target: "AccountPageV2CodeTextEdit-el", key: Ext.EventObject.ENTER, fn: this.myHandler, scope: this }); }, myHandler: function() { alert("ENTER"); },
То есть, инициализируйте подписку в функции onEntityInitialized
Сделал в onEntityInitialized. На нажатие ENTER среагировал новой ошибкой. В консоле: message: TypeError: k is undefined в файле all-combined.js Нашел функцию в all-combined.js, в которой вызывается ошибка. В строке if (k.call(l, h, a) !== true && b).
processEvent: Ext.identityFn, processBinding: function(g, a) { if (this.checkModifiers(g, a)) { var h = a.getKey(), k = g.fn || g.handler, l = g.scope || this, j = g.keyCode, b = g.defaultEventAction, c, e, d = new Ext.EventObjectImpl(a); for (c = 0, e = j.length; c < e; ++c) { if (h === j[c]) { if (k.call(l, h, a) !== true && b) { d[b]() } break } } } },
Чего-то не хватает еще.
Листинг своего кода напишите, и раздел в который добавили его напишите. Если поле стандартное, то тоже стоит указать, попробуем воспроизвести на аналогичных условиях.
Но вероятно хватит и листинга что бы понять в чем проблема.
Ребят, спасибо разобрался. Подвожу итог:
onEntityInitialized: function() { this.callParent(arguments); var keyMap = new Ext.util.KeyMap({ target: "RIBClientSearchPageCyr_SurnameTextEdit-el", key: Ext.EventObject.ENTER, fn: this.onMyPressEnter, scope: this, binding: keyMap }); }, onMyPressEnter: function() { this.showInformationDialog("Test"); },
И все работает.
Разумеется, javascript то case sensitive, а k = g.fn андефайнд должен был намекнуть что функцию не находит. А не находило ее ибо регистр первой буквы был разный :wink:
Есть еще один момент, который хотелось бы уточнить. Возможно, кому-то пригодится. Иногда нужно, что бы функция выполнилась просто по нажатию клавиши на странице, не обязательно в конкретном поле. Собрав все данные, вот что у меня получилось:
onEntityInitialized: function() { this.callParent(arguments); this.keyMap = null; var map = new Ext.util.KeyMap(Ext.getBody(), [{ key: Ext.EventObject.ENTER, fn: this.onMyPressEnter, scope: this, binding: map }]); this.keyMap = map; }, onMyPressEnter: function() { this.showInformationDialog("Test"); //Функция выполнится один раз. Нужно использовать при переходе по процессу if (this.keyMap) { this.keyMap.destroy(); this.keyMap = null; } },