Последовательность определения 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"); |
Нашел особенность именования классов, которая эту ситуацию исключает.
Надо вместо MyApp.Project.Item писать MyApp.project.Item. И тогда все заработает. Но вопрос остается в силе. Баг или фича? |
Ну вначале класс Item помещается в пространство имён MyApp.Project. Т.е. MyApp.Project - это объект, а не функция. Потом MyApp.Project превращается из пространства имён в класс (функцию). Всё, что было в простанстве имён пропадает вместе с классом Item.
fiddle |
Я бы для начала ответил вопросом на вопрос: а зачем вам вообще alternateClassName? Это реликт давно ушедших дней, который в приложениях вообще не должен использоваться.
|
alternateClassName я использую для корневых классов. Например:
Сделал класс MyApp.lib.project.Project. Хранится в папке lib/project - типа каталог пакета классов Проект. Но удобнее юзать для него имя MyApp.lib.Project. Остальные классы имеют вид MyApp.lib.project.*, например MyApp.lib.project.Item |
В Ext JS кроме alternateClassName есть вообще хрень:
alias xtype type ptype и прочяя нечисть Запутаться можно в этой хрени. правда вещи типа ptype мне понравились, даже свои начал делать, например для хелперов сделал htype |
Это не хрень, и путаться в ней не нужно. Это полезные инструменты, которыми можно (и нужно!) пользоваться, тогда и alternateClassName не понадобится вовсе. ;)
Если мы говорим о классах, то в общем случае есть два варианта создания объекта данного класса: Код:
var foo = new My.foo.Foo(); Код:
Ext.define('My.foo.Foo', { Глубинный смысл всего этого добра в том, чтобы уйти от императивного стиля кодирования, когда вам нужно руками создавать все объекты. Вместо этого создавайте классы с конфигурацией, которая ссылается на алиасы, и не нужно будет хардкодить имена классов. По факту их вообще и не нужно использовать, если ваш проект использует Sencha Cmd. Модуль отслеживания зависимостей в Cmd уже весьма неплох, и даже requires можно в общем случае опустить: Cmd все зависимости найдёт за вас, в т.ч. вычислит по alias. alternateClassName это мисфича, которую руки очень чешутся прибить, но к сожалению она сидит очень глубоко в class system, и выкорчёвывать её оттуда будет больнее, чем просто оставить и забыть. Но и использовать её в userspace тоже не нужно, это я вам как доктор говорю. |
А как вы видите мой пример без использования alternateClassName?
|
Как использование основного имени класса? Вы же alternateClassName добавили, потому что печатать меньше. ;)
А если серьёзно, см выше: имя класса в общем случае вообще использовать не нужно. Его нужно задать один раз в Ext.define() для идентификации, и всё. Откройте KitchenSink и вдумчиво посмотрите на примеры View, ViewControllers и прочих полезных штуковин. |
Ясно. На досуге обмозгую эту идею. Жалко что Sencha Cmd не запустилась на Cloud9 (наверное из-за хилости бесплатного тарифного плана). Придется искать варианты, как это сделать.
|
Cmd имеет смысл запускать локально на своей машине, делать сборку и загружать её на рабочие серверы.
|
У меня на локальной машине кроме браузера ничего нет. Разработку я веду в Cloud9. Поэтому и Cmd нужна только там.
|
Интересный подход, а я как раз предпочитаю всё с точностью до наоборот. :)
По поводу незапуска Cmd в Cloud9, есть подробности? Я не уверен, что мы такую платформу поддерживаем, скорее нет чем да; однако вполне возможно, что проблема устранится относительно легко. Я сам Cmd не занимаюсь, но могу тикет в их сторону открыть. |
Как я уже написал, проблема скорее всего в хилости тарифного плана. Там были указания на то, что из-за нехватки ОЗУ программа закрыта. То бишь скорее всего 500 Мб ОЗУ для Cmd не хватает. Поэтому чтобы не уходить с бесплатного сыра, придется искать иные способы запуска Cmd в среде Cloud9 на бесплатном тарифе. Кстати, вроде мелькали слухи, что Cmd не будут больше делать на руби, и тогда станет легче... но возможно чего путаю...
|
Cmd сделана на Java, Ruby там только сбоку, чтобы SASS/Compass компилировать. Насколько я понимаю, и Ruby, и SASS настолько ребят достали, что они к шестой версии допилили компилятор SASS на JavaScript, называется Fashion. Вроде собирались перейти на Fashion совсем и Ruby/SASS выкинуть в пропасть, но насколько до этого момента далеко, я не знаю.
Что касается нехватки памяти, у меня есть подозрения на эту тему. Java, скотина этакая, пытается отхапать физическую RAM вместо виртуальной. Я на такие случаи натыкался уже, хотя там были ещё заморочки RedHat и гипервизора Xen, которому прожорливость Java была поперёк горла. Можете "uname -a" кинуть со своего хоста? Я всё же открою тикет, не дело это так оставлять. |
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
|
Спасибо. Я совершенно забыл, что в Linux дистрибуция в версии ядра не указывается, поэтому можно ещё вот это?
cat /etc/*-release |
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. |