/**************************************************************************
* MVC.jsx
* DESCRIPTION: Классы и методы для реализации приложений согласно архитектуры MVC
* @@@BUILDINFO@@@ MVC.jsx 1.05 Thu Jan 02 2014 18:33:29 GMT+0200
*
* Библиотека ориентирована на приложения любого уровня сложности, требующие развитой подсистемы UI и расширенных методов взаимодействия с пользователем.
*
* NOTICE: Для реализации коллекций использует Collection.jsx
*
/**************************************************************************
* © Вячеслав aka SlavaBuck, 02.01.2014. buck#bk.ru
*/
Примеры использования содержаться в файлах:
SnpMVC_Simple.jsx
SnpMVC_SimpleControllers.jsx
SnpMVC_SimpleApplication.jsx
Библиотека содержит определения следующих MVC-объектов:
----------------------
MVCApplication - родительский класс для приложения в рамках архитектуры MVC (отвечает за диспетчеризацию событий между моделями и представлениями), а также предоставляет весь базовый интерфейс для управления моделями, представлениями и контролёрами.
----------------------
Предоставляемые методы:
addModel(obj) - создаёт на основе объекта obj объект модель и добавляет его в коллекцию моделей приложения;
addView(obj) - создаёт на основе объекта obj объект представление и добавляет его в коллекцию представлений приложения;
addController(obj); - создаёт на основе объекта obj объект контролёр и добавляет его в коллекцию контролёров приложения;
removeModel(obj) - удаляет объект модель из коллекции моделей приложения;
removeView(obj) - удаляет объект представление из в коллекции представлений приложения;
removeController(obj) - удаляет объект контролёр из коллекцию контролёров приложения;
removeMVС(obj) - удаляет сразу объекты модели, представления и контролёра из соответствующих коллекций (в аргументе принимает объект контролёр или его id);
findController(obj) - возвращает контролёр из коллекции контролёров приложения, ассоциированный с переданным в аргументе MVC-объектом;
Create(prefs) - фабричный метод для создания объектов приложений при этом объект параметр (если передан) передаётся конструктору MVCApplication;
Init() - абстрактный метод, предназначеннный для переопределения в конечном приложении (автоматически вызывается из метода run() );
run() - пртотипный метод, перед вызовом метода главного окна приложения show() вызывает метод приложения Init() (если определён) и возвращает результат вызова метода window.show();
_defaultHandler() - для внутреннего использования, используется в качестве обработчика по умолчанию;(onChange/onChanging) для представлений при их связывании
_dispatcher() - для внутреннего использования, реализует диспетчеризацию событий между моделями и представлениями;
----------------------
MVCModel - базовый класс, представляющий модель данных в рамках архитектуры MVC. Может инкапсулировать любые структуры и типы данных JavaScript.
----------------------
Предоставляемые методы:
isValid(); - возвращает свойство _status_ модели, которое может устанавливаться в методе validator(), ассоциированном с данной моделью;
validator() - сам метод изначально вообще не определён в объекте MVCModel, но в диспетчере предусмотрен вызов данного метода при изменении модели - может произвольно определяться пользователем. В качестве аргумента данному методу передаются аргументы аналогично методу Object.watch(). Предполагается, что метод должен возвращать будево значение (которым будет инициализировано встроенное свойство _status_ модели, либо непосредственно его устанавливать в зависимости от полученных в аргументе значений).
----------------------
MVCView - класс представления, ориентирован на использование в рамках подсистемы ScriptUI.
----------------------
Предоставляемые методы:
Init() - прототипный метод, предназначенный для переопределения в конечном объекте представления, вызывается автоматически сразу после добавления представления к своему графическому контейнеру (по умолчанию ничего не делает);
rebind( MVCModel | { string - model.id } ) - метод предназначен для одностороннего связывания представления с моделью в направлении от представления к модели;
remove() - предназначена для удаления ScriptUI объекта, ассоциированного с представлением из контейнера, в котором он содержится, сам объект представления из соответствующей коллекции приложения не удаляется. Вызывается из метода MVCApplication.removeView(obj). Для осуществления специальной функциональности - может быть переопределён в пользовательском объекте;
render() - сам метод изначально вообще не определён в объекте MVCView, но в диспетчере предусмотрен вызов данного метода при изменении ассоциированного с представлением свойства (после изменения связанной с данным представлением модели). Совместно с методом модели validator() могут быть использованы для специального оформления представления в зависимости от состояния модели.
----------------------
MVCController - центральный класс в рамках архитектуры MVC. Реализует связывание моделей и представлений как между собой, так и с самим приложением.
----------------------
Предоставляемые методы:
никаких дополнительных методов не предоставляет. Вся необходимая работа происходит в методе MVCApplication.addController(obj). который ожидает наличия текстового свойства binding в obj, которое в декларативном стиле определяет связываемые данным контролёром модель и представление.
После создания и инициализации, контролёр получает следующие собственные свойства:
... подробности в коде. Таким образом контролёр всегда содержит ссылки на связанные с ним модели и представления. Единственная особенность использования заключается в том, что архитектура использования контролёров рассчитана на архитектуру "одна модель ко многим представлениям" — один контролёр – одно представление.
Несколько контролёров можно привязывать к одной и той же модели (в том числе к одному и тому же свойству одной и той же модели) но к разным представлениям. Бессмысленно привязывать множество моделей к одному представлению - в этом случае всегда будет работать только последнее привязанное. Для связывания в обратном порядке "одно представление - много моделей" добавлен интерфейс rebind() для моделей, который позволяет неограниченно и произвольно переподключать представление между различными моделями. Причём такое переподключение совершенно не влияет на работу связки подключаемой модели со своим 'родным' представлением (или несколькими) в рамках ранее определённого для неё контролёра(ов), а работает параллельно с ними.
Таким образом совместное использование контролёров и интерфейса представлений rebind() позволяет реализовать архитектуру "многие - ко многим" между моделями и представлениями.
Подробности в коде (см. пример SnpMVC_SimpleApplication.jsx).
Обсуждение ведётся в http://forum.rudtp.ru/threads/realizacija-mvc-v-extendscript-collection-jsx-debug-prjaniki.57677/
* MVC.jsx
* DESCRIPTION: Классы и методы для реализации приложений согласно архитектуры MVC
* @@@BUILDINFO@@@ MVC.jsx 1.05 Thu Jan 02 2014 18:33:29 GMT+0200
*
* Библиотека ориентирована на приложения любого уровня сложности, требующие развитой подсистемы UI и расширенных методов взаимодействия с пользователем.
*
* NOTICE: Для реализации коллекций использует Collection.jsx
*
/**************************************************************************
* © Вячеслав aka SlavaBuck, 02.01.2014. buck#bk.ru
*/
Примеры использования содержаться в файлах:
SnpMVC_Simple.jsx
SnpMVC_SimpleControllers.jsx
SnpMVC_SimpleApplication.jsx
Библиотека содержит определения следующих MVC-объектов:
----------------------
MVCApplication - родительский класс для приложения в рамках архитектуры MVC (отвечает за диспетчеризацию событий между моделями и представлениями), а также предоставляет весь базовый интерфейс для управления моделями, представлениями и контролёрами.
----------------------
Предоставляемые методы:
addModel(obj) - создаёт на основе объекта obj объект модель и добавляет его в коллекцию моделей приложения;
addView(obj) - создаёт на основе объекта obj объект представление и добавляет его в коллекцию представлений приложения;
addController(obj); - создаёт на основе объекта obj объект контролёр и добавляет его в коллекцию контролёров приложения;
removeModel(obj) - удаляет объект модель из коллекции моделей приложения;
removeView(obj) - удаляет объект представление из в коллекции представлений приложения;
removeController(obj) - удаляет объект контролёр из коллекцию контролёров приложения;
removeMVС(obj) - удаляет сразу объекты модели, представления и контролёра из соответствующих коллекций (в аргументе принимает объект контролёр или его id);
findController(obj) - возвращает контролёр из коллекции контролёров приложения, ассоциированный с переданным в аргументе MVC-объектом;
Create(prefs) - фабричный метод для создания объектов приложений при этом объект параметр (если передан) передаётся конструктору MVCApplication;
Код:
- основные (необязательные) свойства prefs:
name { String } - ассоциированное с приложением имя/название приложения (если не указано - генерируется автоматичеки)
caption { String } - отображаемая строка в заголовке главного окна приложения (если не указано - используется name)
version { String } - версия приложения (если не указано - генерируется автоматически 0.00)
view { String } - ресурсная ScriptUI строка, используемая для создания главного окна приложения (по умолчанию == 'dialog');
run() - пртотипный метод, перед вызовом метода главного окна приложения show() вызывает метод приложения Init() (если определён) и возвращает результат вызова метода window.show();
_defaultHandler() - для внутреннего использования, используется в качестве обработчика по умолчанию;(onChange/onChanging) для представлений при их связывании
_dispatcher() - для внутреннего использования, реализует диспетчеризацию событий между моделями и представлениями;
----------------------
MVCModel - базовый класс, представляющий модель данных в рамках архитектуры MVC. Может инкапсулировать любые структуры и типы данных JavaScript.
----------------------
Предоставляемые методы:
isValid(); - возвращает свойство _status_ модели, которое может устанавливаться в методе validator(), ассоциированном с данной моделью;
validator() - сам метод изначально вообще не определён в объекте MVCModel, но в диспетчере предусмотрен вызов данного метода при изменении модели - может произвольно определяться пользователем. В качестве аргумента данному методу передаются аргументы аналогично методу Object.watch(). Предполагается, что метод должен возвращать будево значение (которым будет инициализировано встроенное свойство _status_ модели, либо непосредственно его устанавливать в зависимости от полученных в аргументе значений).
----------------------
MVCView - класс представления, ориентирован на использование в рамках подсистемы ScriptUI.
----------------------
Предоставляемые методы:
Init() - прототипный метод, предназначенный для переопределения в конечном объекте представления, вызывается автоматически сразу после добавления представления к своему графическому контейнеру (по умолчанию ничего не делает);
rebind( MVCModel | { string - model.id } ) - метод предназначен для одностороннего связывания представления с моделью в направлении от представления к модели;
remove() - предназначена для удаления ScriptUI объекта, ассоциированного с представлением из контейнера, в котором он содержится, сам объект представления из соответствующей коллекции приложения не удаляется. Вызывается из метода MVCApplication.removeView(obj). Для осуществления специальной функциональности - может быть переопределён в пользовательском объекте;
render() - сам метод изначально вообще не определён в объекте MVCView, но в диспетчере предусмотрен вызов данного метода при изменении ассоциированного с представлением свойства (после изменения связанной с данным представлением модели). Совместно с методом модели validator() могут быть использованы для специального оформления представления в зависимости от состояния модели.
----------------------
MVCController - центральный класс в рамках архитектуры MVC. Реализует связывание моделей и представлений как между собой, так и с самим приложением.
----------------------
Предоставляемые методы:
никаких дополнительных методов не предоставляет. Вся необходимая работа происходит в методе MVCApplication.addController(obj). который ожидает наличия текстового свойства binding в obj, которое в декларативном стиле определяет связываемые данным контролёром модель и представление.
После создания и инициализации, контролёр получает следующие собственные свойства:
Код:
MVCController.id = (id)||'ctrl';
MVCController.app = appRef; // Свойство app контролёра всегда указывает на текущий экземпляр объекта-приложения, в рамках которого был создан контролёр
MVCController.binding = ''; // Текстовое свойство, которое в декларативном стиле содержит описание связи модель-контролёр в формате "id_model.prop[.prop][.prop]:id_view.prop[.prop][.prop]"
MVCController.model = null; // Указатель на соответствующий объект модели (укзанный в строке binding) в списке моделей приложения
MVCController.model_obj = null;
MVCController.model_key = null; // model_obj[model_key] == model_value
MVCController.model_value = null;
MVCController.view = null; // Указатель на объект представления в списке представлений приложения
MVCController.view_obj = null;
MVCController.view_key = null; // view_obj[view_key] связывается с model_value
Несколько контролёров можно привязывать к одной и той же модели (в том числе к одному и тому же свойству одной и той же модели) но к разным представлениям. Бессмысленно привязывать множество моделей к одному представлению - в этом случае всегда будет работать только последнее привязанное. Для связывания в обратном порядке "одно представление - много моделей" добавлен интерфейс rebind() для моделей, который позволяет неограниченно и произвольно переподключать представление между различными моделями. Причём такое переподключение совершенно не влияет на работу связки подключаемой модели со своим 'родным' представлением (или несколькими) в рамках ранее определённого для неё контролёра(ов), а работает параллельно с ними.
Таким образом совместное использование контролёров и интерфейса представлений rebind() позволяет реализовать архитектуру "многие - ко многим" между моделями и представлениями.
Подробности в коде (см. пример SnpMVC_SimpleApplication.jsx).
Обсуждение ведётся в http://forum.rudtp.ru/threads/realizacija-mvc-v-extendscript-collection-jsx-debug-prjaniki.57677/