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

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

//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;
	}
}, 
Показать все комментарии

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

Не могу понять в чем проблема. Террасофт версия 3.1.1.6.
Не отрабатываются события OnKeyPress, OnKeyDown и OnKeyUp.
Например, вешаю простой вывод в лог на DataGrid в окне wnd_OfferingsGridArea, а при нажатии на любую кнопку ничего не происходит. Вообще ничего.
В чем может быть проблема?

Нравится

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

Это кажется ошибка ядра, исправленная в более поздних версиях.

Э-э-э... в более поздних версиях бинарников? Или вообще всей системы?

добрый день.

Данный вопрос будет передан в отдел разработки программного продукта для диагностики и анализа. Vы оповестим Вас о принятом решении касательно данного вопроса и о сроках его решения.

Terrasoft Support Team

Бинарников. В 3.3 все нормально. А когда-то сам столкнулся с тем что OnKeyPress не работал в гриде

Ну, одно дело получить обновление бинарников для 3.1.1.6, а другое дело перейти на систему версии 3.3. :)

Проверила, на последних 3.1.1 не работает, а вот уже в 3.2.0 все ок:)

Замечательно... :( Значит, как сказала Коваленко Ирина, ждем, что скажет отдел разработки программного продукта...

Алексей, занимаемся указанной проблемой.

"Ключник Алексей" написал:Александр, занимаемся указанной проблемой.

Алексей. :)

Да, извините, исправился :)

Алексей, добрый день.
Реализованы указанные события для нередактируемого реестра. Служба технической поддержки свяжется с Вами для предоставления ссылки на обновление.

Показать все комментарии