Javascript.RU

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

Последовательность определения alternateClassName
Здравствуйте!

Не могу понять, это баг или фича такая.

Ext.define("MyApp.Item", {	
	alternateClassName: "MyApp.Project.Item"	
});

Ext.define("MyApp.Project", {	
	alternateClassName: "MyApp.Project"	
});


В итоге выполнения кода получаем неприятность в виде:

MyApp.Project.Item === undefined


Иными словами, Сенча не предусмотрела вариант, когда альтернативные имена классов определяются в не совсем правильной последовательности.

Может я не догоняю и такая ситуация правильная?

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

Ext.namespace("MyApp", "MyApp.Project");

Последний раз редактировалось khusamov, 17.05.2015 в 16:54.
Ответить с цитированием
  #2 (permalink)  
Старый 17.05.2015, 17:03
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Нашел особенность именования классов, которая эту ситуацию исключает.

Надо вместо MyApp.Project.Item писать MyApp.project.Item. И тогда все заработает.

Но вопрос остается в силе. Баг или фича?
Ответить с цитированием
  #3 (permalink)  
Старый 18.05.2015, 12:47
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

Ну вначале класс Item помещается в пространство имён MyApp.Project. Т.е. MyApp.Project - это объект, а не функция. Потом MyApp.Project превращается из пространства имён в класс (функцию). Всё, что было в простанстве имён пропадает вместе с классом Item.

fiddle
Ответить с цитированием
  #4 (permalink)  
Старый 21.05.2015, 22:03
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Я бы для начала ответил вопросом на вопрос: а зачем вам вообще alternateClassName? Это реликт давно ушедших дней, который в приложениях вообще не должен использоваться.
Ответить с цитированием
  #5 (permalink)  
Старый 21.05.2015, 22:44
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

alternateClassName я использую для корневых классов. Например:

Сделал класс MyApp.lib.project.Project.

Хранится в папке lib/project - типа каталог пакета классов Проект.

Но удобнее юзать для него имя MyApp.lib.Project.

Остальные классы имеют вид MyApp.lib.project.*, например MyApp.lib.project.Item
Ответить с цитированием
  #6 (permalink)  
Старый 21.05.2015, 22:46
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

В Ext JS кроме alternateClassName есть вообще хрень:

alias
xtype
type
ptype
и прочяя нечисть

Запутаться можно в этой хрени.

правда вещи типа ptype мне понравились, даже свои начал делать, например для хелперов сделал htype
Ответить с цитированием
  #7 (permalink)  
Старый 21.05.2015, 23:11
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Это не хрень, и путаться в ней не нужно. Это полезные инструменты, которыми можно (и нужно!) пользоваться, тогда и alternateClassName не понадобится вовсе. ;)

Если мы говорим о классах, то в общем случае есть два варианта создания объекта данного класса:

Код:
var foo = new My.foo.Foo();
или по алиасу:

Код:
Ext.define('My.foo.Foo', {
    xtype: 'foo',
    // или:
    // alias: 'widget.foo',
});

var foo = Ext.widget('foo');
xtype это частный случай alias для компонентов (виджетов). Есть ещё много других пространств для алиасов: store.*, controller.*, etc.

Глубинный смысл всего этого добра в том, чтобы уйти от императивного стиля кодирования, когда вам нужно руками создавать все объекты. Вместо этого создавайте классы с конфигурацией, которая ссылается на алиасы, и не нужно будет хардкодить имена классов. По факту их вообще и не нужно использовать, если ваш проект использует Sencha Cmd. Модуль отслеживания зависимостей в Cmd уже весьма неплох, и даже requires можно в общем случае опустить: Cmd все зависимости найдёт за вас, в т.ч. вычислит по alias.

alternateClassName это мисфича, которую руки очень чешутся прибить, но к сожалению она сидит очень глубоко в class system, и выкорчёвывать её оттуда будет больнее, чем просто оставить и забыть. Но и использовать её в userspace тоже не нужно, это я вам как доктор говорю.
Ответить с цитированием
  #8 (permalink)  
Старый 21.05.2015, 23:24
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

А как вы видите мой пример без использования alternateClassName?
Ответить с цитированием
  #9 (permalink)  
Старый 21.05.2015, 23:46
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Как использование основного имени класса? Вы же alternateClassName добавили, потому что печатать меньше. ;)

А если серьёзно, см выше: имя класса в общем случае вообще использовать не нужно. Его нужно задать один раз в Ext.define() для идентификации, и всё.

Откройте KitchenSink и вдумчиво посмотрите на примеры View, ViewControllers и прочих полезных штуковин.
Ответить с цитированием
  #10 (permalink)  
Старый 21.05.2015, 23:49
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Ясно. На досуге обмозгую эту идею. Жалко что Sencha Cmd не запустилась на Cloud9 (наверное из-за хилости бесплатного тарифного плана). Придется искать варианты, как это сделать.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Последовательность выполнения кода Makeda Общие вопросы Javascript 1 16.06.2014 14:35
Последовательность выполнения функций nematod Общие вопросы Javascript 7 25.02.2011 03:16
Простой сценарий определения текущего времени у меня в браузере почему-то не работает WitaliG Общие вопросы Javascript 2 02.08.2010 22:05
Метод определения номера элемента в коллекции.. ZElk Общие вопросы Javascript 1 12.10.2009 15:47
Скрипт определения WMID по WMZ AvaGet Общие вопросы Javascript 3 17.12.2008 03:59