Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.12.2014, 18:31
Аспирант
Отправить личное сообщение для treasury Посмотреть профиль Найти все сообщения от treasury
 
Регистрация: 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 только в новом файле.
Ответить с цитированием
  #2 (permalink)  
Старый 04.12.2014, 07:24
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

вы можете подписаться на эти события в контроллере ..и повесить на них методы любого объекта.
view.on({
    itemclick : this.onDataviewSelectConfigure,
    select : this.onDataviewSelect
    scope : this
});
Ответить с цитированием
  #3 (permalink)  
Старый 04.12.2014, 11:18
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

В контроллере можно. И даже нужно. Просто указываете что листенеры работают в контроллере и пишете все функции там:

listeners: {
	itemclick: {
		fn: 'onDataviewSelectConfigure',
		single: false
	},
	select: 'onDataviewSelect',
	scope: 'controller' // <------------------
}


А зачем вы пишете "single: false"? Это ведь как бы по умолчанию следует. Другое дело если "true"...
Ответить с цитированием
  #4 (permalink)  
Старый 04.12.2014, 11:57
Аспирант
Отправить личное сообщение для treasury Посмотреть профиль Найти все сообщения от treasury
 
Регистрация: 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
Что еще нужно поправить?
Ответить с цитированием
  #5 (permalink)  
Старый 04.12.2014, 12:09
Аспирант
Отправить личное сообщение для treasury Посмотреть профиль Найти все сообщения от treasury
 
Регистрация: 26.08.2014
Сообщений: 49

Сообщение от siber-biber Посмотреть сообщение
вы можете подписаться на эти события в контроллере ..и повесить на них методы любого объекта.
view.on({
    itemclick : this.onDataviewSelectConfigure,
    select : this.onDataviewSelect
    scope : this
});
Это я не понял как применить( Я так понял это в глобальном контроллере описывать, которые лежат в app/controller?
Ответить с цитированием
  #6 (permalink)  
Старый 04.12.2014, 13:57
Аспирант
Отправить личное сообщение для treasury Посмотреть профиль Найти все сообщения от treasury
 
Регистрация: 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, еще событие выполняется при инициализации приложения, как это исключить? Спасибо!
Ответить с цитированием
  #7 (permalink)  
Старый 05.12.2014, 10:16
Аспирант
Отправить личное сообщение для treasury Посмотреть профиль Найти все сообщения от treasury
 
Регистрация: 26.08.2014
Сообщений: 49

Я извиняюсь за назойливость, но все таки что нужно поправить в моем случае, чтобы заработало? Спасибо!
Ответить с цитированием
  #8 (permalink)  
Старый 05.12.2014, 11:04
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 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" }
			]
		}
	]
	
});


Обратите внимание на кнопки в конце класса. Их хендлеры автоматически ищутся в контроллере, скоп не указываем. Это относится почти к любому дочернему компоненту.
Ответить с цитированием
  #9 (permalink)  
Старый 05.12.2014, 15:26
Аспирант
Отправить личное сообщение для treasury Посмотреть профиль Найти все сообщения от treasury
 
Регистрация: 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
Ответить с цитированием
  #10 (permalink)  
Старый 05.12.2014, 17:24
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Сообщение от treasury
Написал во view как вы сказали
А кто будет подключать контроллер?
controller: "main" // это где?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как можно такое организовать. Вопрос про скрипт на sotmarket.ru developer Элементы интерфейса 2 25.07.2013 10:09
Как можно нажать сразу на несколько кнопок? Yan.Total Events/DOM/Window 2 21.03.2013 11:02
можно как то отправить содержимое нужного дива в другую форму а потом расспечатьтать sarik Общие вопросы Javascript 1 04.03.2013 16:08
Как можно отловить id который добавил с помощью append() ? saturn Элементы интерфейса 4 17.01.2012 01:35