| 
	| 
	
	| 
		
	| 
			
			 
			
				03.12.2014, 18:31
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 26.08.2014 
						Сообщений: 49
					 
		
 |  |  
	| 
				Как можно разделить main view и listeners?
			 Помогите с архитектурой, допустим у меня есть main view, фрагмент:  
items: [
                {
                    xtype: 'dataview',
                    autoScroll: true,
                    id: 'dataview',
                    margin: '10 0 10 10',
                    disableSelection: false,
                    itemSelector: 'div',
                    itemTpl: [
                        '<tpl for=".">',
                        '<table>',
                        '   <tr>',
                        '       <td width=\'200px\'><input type="checkbox" enabled="enabled" value="open" name="comment_status" <tpl if="active">checked="checked"</tpl> />{nm}</td>',
                        '       <td class="configure"></td>',
                        '   </tr>    ',
                        '       </table>',
                        '   ',
                        '</tpl>'
                    ],
                    store: 'CarStore',
                    listeners: {
                        itemclick: {
                            fn: 'onDataviewSelectConfigure',
                            single: false
                        },
                        select: 'onDataviewSelect'
                    }
Здесь у меня прописан listeners, я сейчас здесь же в конце view описываю эти функции: 
onDataviewSelect: function(dataview, record, eOpts) {
        console.log("OK");
    },
У меня вопрос каким образом их можно разделить? Т.е. я могу как-то их описать в контроллере? Или хотя-бы во view только в новом файле. |  |  
	| 
		
	| 
			
			 
			
				04.12.2014, 07:24
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 07.08.2013 
						Сообщений: 214
					 
		
 |  |  
	| вы можете подписаться на эти события в контроллере ..и повесить на них методы любого объекта. 
view.on({
    itemclick : this.onDataviewSelectConfigure,
    select : this.onDataviewSelect
    scope : this
});
 |  |  
	| 
		
	| 
			
			 
			
				04.12.2014, 11:18
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 06.06.2014 
						Сообщений: 292
					 
		
 |  |  
	| В контроллере можно. И даже нужно. Просто указываете что листенеры работают в контроллере и пишете все функции там: 
listeners: {
	itemclick: {
		fn: 'onDataviewSelectConfigure',
		single: false
	},
	select: 'onDataviewSelect',
	scope: 'controller' // <------------------
}
А зачем вы пишете "single: false"? Это ведь как бы по умолчанию следует. Другое дело если "true"... |  |  
	| 
		
	| 
			
			 
			
				04.12.2014, 11:57
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 26.08.2014 
						Сообщений: 49
					 
		
 |  |  
	| 
	
 
	| Сообщение от Infarch   |  
	| В контроллере можно. И даже нужно. Просто указываете что листенеры работают в контроллере и пишете все функции там: 
 
 
listeners: {
	itemclick: {
		fn: 'onDataviewSelectConfigure',
		single: false
	},
	select: 'onDataviewSelect',
	scope: 'controller' // <------------------
}
 А зачем вы пишете "single: false"? Это ведь как бы по умолчанию следует. Другое дело если "true"...
 |  
	
 У меня что-то не получается ни так ни так. Я правильно понимаю, что здесь вы говорите о ViewController? Т.е. если я добавляю во view строчку scope: 'controller' , я говорю что обработчик у меня будет реализован в viewController. Я сделал:  
listeners: {
                        itemclick: {
                            fn: 'onDataviewSelectConfigure',
                            scope: 'controller'
                        },
                        select: {
                            fn: 'onDataviewSelect',
                            scope: 'controller'
                        }
                    }
Далее во viewController: 
Ext.define('MyApp.view.MainViewController', {
    extend: 'Ext.app.ViewController',
    alias: 'controller.main',
onDataviewSelect: function(dataview, record, eOpts) {
        console.log("OK");
    },
});
Далее в консоле такое: Uncaught TypeError: Cannot read property 'apply' of undefined 
Что еще нужно поправить?
			
			
	
			
			
			
			
			
				  |  |  
	| 
		
	| 
			
			 
			
				04.12.2014, 12:09
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 26.08.2014 
						Сообщений: 49
					 
		
 |  |  
	| 
	
 
	| Сообщение от siber-biber   |  
	| вы можете подписаться на эти события в контроллере ..и повесить на них методы любого объекта. 
 
view.on({
    itemclick : this.onDataviewSelectConfigure,
    select : this.onDataviewSelect
    scope : this
});
 |  
	
 Это я не понял как применить( Я так понял это в глобальном контроллере описывать, которые лежат в app/controller? |  |  
	| 
		
	| 
			
			 
			
				04.12.2014, 13:57
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 26.08.2014 
						Сообщений: 49
					 
		
 |  |  
	| Написал так в контроллере  
Ext.define('MyApp.controller.Main', {
    extend: 'Ext.app.Controller',
    views: ['Main'],
    init: function() {
        this.control({
            'dataview': {
                select : this.onDataviewSelect
    }
        });
    },
    onDataviewSelect: function(dataview, record, eOpts) {
    console.log("OK");
}
});
Но помимо работы события при выборе строки в dataview, еще событие выполняется при инициализации приложения, как это исключить? Спасибо! |  |  
	| 
		
	| 
			
			 
			
				05.12.2014, 10:16
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 26.08.2014 
						Сообщений: 49
					 
		
 |  |  
	| Я извиняюсь за назойливость, но все таки что нужно поправить в моем случае, чтобы заработало? Спасибо! |  |  
	| 
		
	| 
			
			 
			
				05.12.2014, 11:04
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 06.06.2014 
						Сообщений: 292
					 
		
 |  |  
	| treasury, вы не там описали скоп. Главный контроллер не трогайте, хендлеры работают во вью контроллере компонента. Вот как надо:
 
listeners: {
	itemclick: 'onDataviewSelectConfigure',
	select: 'onDataviewSelect',
	scope: 'controller'
}
Скоп описывается для всех листенеров оптом. НО! это касается только главного элемента, к которому подключен контроллер. В дочерних его компонентах скоп не нужен, поиск хендлеров идет в контроллере по умолчанию. Например:
 
Ext.define("PM.view.settings.process.Show", {
	extend: "Ext.panel.Panel",
	requires: [ "Ext.grid.column.Check" ],
	alias: "widget.settings-process-show",
	controller: "settings-process-show",
	viewModel: { type: "settings-process-showedit" },
	bind: { title: "{model.Name}" },
	items: [
		{ xtype: "gridpanel",
			bind: { store: "{subjectFields}" },
			columns: [
				{ xtype : "checkcolumn", text : "#Active", dataIndex : "Active", disabled: true },
				{ text: "#Name", dataIndex: "Name", flex: 1 }
			]
		},
		{ xtype: "docia-separator" },
		{ xtype: "container",
			layout: "hbox",
			align: "left",
			defaults: {
				width: 75,
				margin: "0 10 0 0"
			},
			items: [
				{ xtype: "button", text: "<< Back", handler: "goBack" },
				{ xtype: "button", text: "Edit", handler: "doEdit" }
			]
		}
	]
	
});
Обратите внимание на кнопки в конце класса. Их хендлеры автоматически ищутся в контроллере, скоп не указываем. Это относится почти к любому дочернему компоненту. 
			
			
	
			
			
			
			
			
				  |  |  
	| 
		
	| 
			
			 
			
				05.12.2014, 15:26
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 26.08.2014 
						Сообщений: 49
					 
		
 |  |  
	| Написал во view как вы сказали: 
Ext.define('MyApp.view.Main', {
    extend: 'Ext.container.Viewport',
    alias: 'widget.main',
    xtype: 'main',
.......................................
items: [
                {
                    xtype: 'dataview',
                    autoScroll: true,
                    id: 'dataview',
                    itemId: 'dataview',
                    margin: '10 0 10 10',
                    disableSelection: false,
                    itemSelector: 'div',
                    itemTpl: [],
                    store: 'CarStore',
                    listeners: {
                        itemclick: 'onDataviewSelectConfigure',
                        select: 'onDataviewSelect',
                        scope: 'controller'
}
Далее viewController:
 
Ext.define('MyApp.view.MainViewController', {
    extend: 'Ext.app.ViewController',
    alias: 'controller.main',
onDataviewSelect: function(dataview, record, eOpts) {
        console.log("OK");
    }
});
Но ничего не поменялось Uncaught TypeError: Cannot read property 'apply' of undefined |  |  
	| 
		
	| 
			
			 
			
				05.12.2014, 17:24
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 06.06.2014 
						Сообщений: 292
					 
		
 |  |  
	| 
	
 
	| Сообщение от treasury |  
	| Написал во view как вы сказали |  
	
 А кто будет подключать контроллер?
 
controller: "main" // это где?
 |  |  |  |