Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Последовательность определения alternateClassName (https://javascript.ru/forum/extjs/55856-posledovatelnost-opredeleniya-alternateclassname.html)

khusamov 17.05.2015 16:47

Последовательность определения 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 17:03

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

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

Но вопрос остается в силе. Баг или фича?

novikov 18.05.2015 12:47

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

fiddle

nohuhu 21.05.2015 22:03

Я бы для начала ответил вопросом на вопрос: а зачем вам вообще alternateClassName? Это реликт давно ушедших дней, который в приложениях вообще не должен использоваться.

khusamov 21.05.2015 22:44

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

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

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

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

Остальные классы имеют вид MyApp.lib.project.*, например MyApp.lib.project.Item

khusamov 21.05.2015 22:46

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

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

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

правда вещи типа ptype мне понравились, даже свои начал делать, например для хелперов сделал htype

nohuhu 21.05.2015 23:11

Это не хрень, и путаться в ней не нужно. Это полезные инструменты, которыми можно (и нужно!) пользоваться, тогда и 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 тоже не нужно, это я вам как доктор говорю.

khusamov 21.05.2015 23:24

А как вы видите мой пример без использования alternateClassName?

nohuhu 21.05.2015 23:46

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

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

Откройте KitchenSink и вдумчиво посмотрите на примеры View, ViewControllers и прочих полезных штуковин.

khusamov 21.05.2015 23:49

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

nohuhu 21.05.2015 23:52

Cmd имеет смысл запускать локально на своей машине, делать сборку и загружать её на рабочие серверы.

khusamov 21.05.2015 23:57

У меня на локальной машине кроме браузера ничего нет. Разработку я веду в Cloud9. Поэтому и Cmd нужна только там.

nohuhu 22.05.2015 00:21

Интересный подход, а я как раз предпочитаю всё с точностью до наоборот. :)

По поводу незапуска Cmd в Cloud9, есть подробности? Я не уверен, что мы такую платформу поддерживаем, скорее нет чем да; однако вполне возможно, что проблема устранится относительно легко. Я сам Cmd не занимаюсь, но могу тикет в их сторону открыть.

khusamov 22.05.2015 01:27

Как я уже написал, проблема скорее всего в хилости тарифного плана. Там были указания на то, что из-за нехватки ОЗУ программа закрыта. То бишь скорее всего 500 Мб ОЗУ для Cmd не хватает. Поэтому чтобы не уходить с бесплатного сыра, придется искать иные способы запуска Cmd в среде Cloud9 на бесплатном тарифе. Кстати, вроде мелькали слухи, что Cmd не будут больше делать на руби, и тогда станет легче... но возможно чего путаю...

nohuhu 22.05.2015 01:47

Cmd сделана на Java, Ruby там только сбоку, чтобы SASS/Compass компилировать. Насколько я понимаю, и Ruby, и SASS настолько ребят достали, что они к шестой версии допилили компилятор SASS на JavaScript, называется Fashion. Вроде собирались перейти на Fashion совсем и Ruby/SASS выкинуть в пропасть, но насколько до этого момента далеко, я не знаю.

Что касается нехватки памяти, у меня есть подозрения на эту тему. Java, скотина этакая, пытается отхапать физическую RAM вместо виртуальной. Я на такие случаи натыкался уже, хотя там были ещё заморочки RedHat и гипервизора Xen, которому прожорливость Java была поперёк горла.

Можете "uname -a" кинуть со своего хоста? Я всё же открою тикет, не дело это так оставлять.

khusamov 22.05.2015 01:59

Linux khusamov-***-1399283 3.14.13-c9 #1 SMP Tue Aug 19 16:13:44 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

nohuhu 22.05.2015 02:15

Спасибо. Я совершенно забыл, что в Linux дистрибуция в версии ядра не указывается, поэтому можно ещё вот это?

cat /etc/*-release

khusamov 22.05.2015 02:17

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
NAME="Ubuntu"
VERSION="14.04.1 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.1 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"


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