Отследить нажатие 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" И соответственно не работает.
Вот, что написал:
[javascript]
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;
}
},
[/javascript]
Подскажите, что не так. Спасибо.
На момент начала события init, Ext компоненты(текстовое поле) еще нет, делайте так:
[javascript]
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");
},
[/javascript]
То есть, инициализируйте подписку в функции onEntityInitialized
Сделал в onEntityInitialized. На нажатие ENTER среагировал новой ошибкой. В консоле: message: TypeError: k is undefined в файле all-combined.js Нашел функцию в all-combined.js, в которой вызывается ошибка. В строке if (k.call(l, h, a) !== true && b).
[javascript]
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
}
}
}
},
[/javascript]
Чего-то не хватает еще.
Листинг своего кода напишите, и раздел в который добавили его напишите. Если поле стандартное, то тоже стоит указать, попробуем воспроизвести на аналогичных условиях.
Но вероятно хватит и листинга что бы понять в чем проблема.
Ребят, спасибо разобрался. Подвожу итог:
[javascript]
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]
И все работает.
Разумеется, javascript то case sensitive, а k = g.fn андефайнд должен был намекнуть что функцию не находит. А не находило ее ибо регистр первой буквы был разный :wink:
Есть еще один момент, который хотелось бы уточнить. Возможно, кому-то пригодится. Иногда нужно, что бы функция выполнилась просто по нажатию клавиши на странице, не обязательно в конкретном поле. Собрав все данные, вот что у меня получилось:
[javascript]
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;
}
},
[/javascript]