Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   События контроллера приложения (https://javascript.ru/forum/extjs/62794-sobytiya-kontrollera-prilozheniya.html)

khusamov 29.04.2016 20:28

События контроллера приложения
 
Могу ли я подписаться как-то на события контроллера приложения Ext.app.Controller из какого-либо вида?

У меня есть контроллер, который обрабатывает ввод из сканера штрих-кодов. Он сам что-то делает и когда вводится код, то генерирует событие barcode.

Я хотел бы, чтобы некоторые виды его отображали. Но как из вида подписаться на событие контроллера (не путать с контроллером вида) приложения не ясно.

khusamov 29.04.2016 20:33

Пока сделал так. Правильно ли это я сделал?

Ext.define("Element.view.cuttingList.CuttingListController", {
	
	extend: "Ext.app.ViewController",
	alias: "controller.cutting-list",
	
	init: function() {
		var app = Element.getApplication();
		app.getController("Barcode").on("barcode", "onBarcode", this);
	},

nohuhu 29.04.2016 21:15

Используйте домены событий, я их именно для таких целей и добавлял: http://stackoverflow.com/questions/1...55497#19255497

А вот ещё кусок примера в документации, о которой я уже успел забыть. :) http://docs.sencha.com/extjs/6.0/6.0...-method-listen

khusamov 30.04.2016 17:05

Правильно?

init: function() {
		this.listen({
			controller: {
				"*": {
					barcode: "onBarcode",
					scope: this
				}
			}
		});
},


или

"#barcode": {
	barcode: "onBarcode",
	scope: this
}


или

"barcode": {
	barcode: "onBarcode",
	scope: this
}


Правда последнее похоже будет конфликтовать с алиасами контролеров видов... Поэтому наверное лучше так:

"app.barcode": {
	barcode: "onBarcode",
	scope: this
}

nohuhu 02.05.2016 20:51

Да, так должно работать. Две небольшие поправки: во-первых, scope: this избыточно, т.к. это и есть контекст вызова по умолчанию для методов. Во-вторых, в Ext 5+ можно вместо вызова this.listen() просто задать конфигурацию listen:

Ext.define('My.app.Controller', {
    extend: 'Ext.app.Controller',

    listen: {
        controller: {
            '#barcode': {
                'barcodeInput': 'onBarCodeInput'
            }
        }
    },

    onBarCodeInput: function() {
        ...
    }
});


Старайтесь писать декларативный код везде, где возможно; это вам пригодится многократно.


Часовой пояс GMT +3, время: 13:17.