Отследить нажатие Enter в текстовом поле, для вызова своего метода. BpmOnline 7.5.

Здравствуйте.

Подскажите, как использовать события нажатия кнопок в текстовом поле.
Объявлено текстовое поле:

//diff
{
"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, выполняется моя функция.

Нравится

9 комментариев

Олег, если правильно понимаю, то вот здесь - 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;
	}
}, 
Показать все комментарии