Тема: Ext.FocusManager
Показать сообщение отдельно
  #23 (permalink)  
Старый 15.04.2017, 14:12
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Первая версия универсального контроллера ввода штрих-кодов. Для его использования по идее надо сделать контроллер обработки, который подписывается на событие barcode.


/* global Ext */

/**
 * Контроллер ввода штрих-кодов.
 */

Ext.define("Ews.controller.Barcode", {

	extend: "Ext.app.Controller",

	requires: ["Ews.util.EventUtil"],

	barcodePrefix: "$",

	barcodeSuffix: "&",
	//barcodeSuffixCode: 13,

	mode: "listen", // listen | scan

	value: "",

	init: function() {
		var me = this;

		// Событие keypress похоже надо заменить на keydown
		// [url]http://javascript.ru/forum/extjs/63113-ext-focusmanager-2.html[/url]
		Ext.getWin().on("keypress", "onWindowKeyPress", me, { capture: true });

		console.group("Слежение за штрих-кодами включено.");
		console.log("Префикс:", me.barcodePrefix);
		console.log("Суффикс:", me.barcodeSuffix);
		console.groupEnd();
	},

	onWindowKeyPress: function(event) {
		var me = this;
		var keyChar = Ews.util.EventUtil.getCharFromEvent(event);
		if (me.mode == "scan") {
			if (keyChar == me.barcodeSuffix) {
			//if (event.keyCode == me.barcodeSuffixCode) {
				me.end();
			} else {
				me.resume(keyChar);
			}
		} else {
			if (keyChar == me.barcodePrefix) me.begin();
		}
	},

	begin: function() {
		var me = this;
		me.value = "";
		me.mode = "scan";
		console.log("Начат ввод штрих-кода.");
	},

	resume: function(keyChar) {
		var me = this;
		me.value += keyChar;
		console.log("Ввод штрих-кода продолжается:", keyChar, me.value);
	},

	end: function() {
		var me = this;
		me.mode = "listen";
		me.onEnterBarcode(me.value);
		console.log("Ввод штрих-кода завершен. Введенный код:", me.value);
	},

	onEnterBarcode: function(barcodeValue) {
		var me = this;
		me.fireEvent("barcode", barcodeValue);
	}

});


И вспомогательная утилитка:

/* global Ext */

Ext.define("Ews.util.EventUtil", {

	singleton: true,

	/**
	 * Получение кода символа из события keypress.
	 * Вспомогательная функция.
	 * event.type должен быть keypress (функция работает только с keypress).
	 * [url]https://learn.javascript.ru/keyboard-events[/url]
	 */
	 
	// Привести в соответствие со свойством browserEvent
	// [url]http://docs.sencha.com/extjs/6.0/6.0.1-classic/#!/api/Ext.event.Event-property-browserEvent[/url]
	 
	getCharFromEvent: function(event) {
		
		//event = event instanceof Ext.event.Event ? event.browserEvent : event;
		
		
		if (event.which == null) { // IE
			if (event.keyCode < 32) return null; // спец. символ
			return String.fromCharCode(event.keyCode);
		}
		
		if (event.which != 0 && event.charCode != 0) { // все кроме IE
			if (event.which < 32) return null; // спец. символ
			return String.fromCharCode(event.which); // остальные
		}
		
		return null; // спец. символ
	}

});
__________________
Хусамов Сухроб, Москва, khusamov@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием