(Файлы: ha-app/app.js
, ha-app/app/event-dispatcher.js
)
Чтобы не передавать в конструкторы каждого отображения (view) и каждой модели
ссылки на уже существующие объекты, введён-таки снова god-объект
"приложение" (App
), который хранит в себе ссылки на объекты,
доступ к которым необходим из других объектов.
Пример:
// ha-app/models/code.js
var app = require('../app')();
var Code = function() {
var code = { ... };
// --- skip ---
app.register('model.code', code);
return code;
}
// ha-app/wrappers/javascript-runner.js
var app = require('../app')();
var JavascriptRunner = function() {
var runner = {
// --- skip ---
evaluate: function() {
// Получаем ссылку на модель
var code = app.get('model.code');
// Получаем javascript-код
var jsCode = code.js;
// --- skip ---
}
};
// --- skip ---
return runner;
};
Кроме того, объект App
обеспечивает передачу сообщений от любого отображения
или модели к любому объекту, подписавшемуся на это сообщение.
Пример:
// Получаем ссылку на объект "Приложение"
var app = require('../app')();
var ShowAnswersView = function() {
var view = {
initialize: function() {
// Если у задачи вызван метод addAnswers, отображаем кнопку
app.on('task.has.answers', this.onTaskHasAnswers, this);
// При нажатии кнопки "Показать ответы"
document.querySelector('.js--show-answers').addEventListener('click',
function() {
// Отправляем сообщение объекту "Ответы"
app.emit('answers.show');
}
);
},
// --- skip ---
};
view.initialize();
return view;
}
Остальные объекты: модели, отображения и обёртки будут рассмотрены ниже.
Модели (model) - объекты, хранящие в себе данные. По изменению данных могут отправлять события. Могут содержать логику, в частности, для заданий определяют - выполнено ли задание или нет.
-
Task - базовая модель для заданий
-
JavascriptTask - javascript-задание
-
JavascriptChallengeTask - javascript-испытание
-
Goal - цель в задании
-
JavascriptGoal - цель в javascript-задании
-
JavascriptChallengeGoal - цель в javascript-испытании
-
Code - модель, хранящая текущее состояние кода
-
AstAsserts - проверки совпадения кода с заданными шаблонами
-
ConsoleAsserts - проверка содержимого консоли
Отображения (view) - объекты, плотно связанные с DOM, реагируют на события, что-нибудь меняют в DOM и отправляют события, реагируя на DOM-события.
- TaskView - отображение задания. На самом деле, могло бы быть обёрткой, т.к. по большей части создаёт другие отображения, обёртки и модели
- GoalsView - показывает, насколько выполнены задания
- JavascriptConsoleView - отображает сообщения от консоли
- JavascriptControlsView - кнопки управления заданием (проверить на сервере, сохранить код и т.п.)
- JavascriptRunView - кнопка "выполнить код", чекбокс "автовыполнение"
- NextTaskView - кнопка "следующее задание"
- ShowAnswersView - кнопка "показать ответ"
- TaskCompletedView - сообщение "задание выполнено"
Обёртки (wrapper) - объекты, содержащие в себе всю остальную логику, не попавшую в модели или отображения.
- Answers - получает доступ к редакторам и выводит в них автоматическое выполнение задания
- Console - объект, принимающий методы вместо стандартного
window.console
- ConsoleSlowdown - прокладка между
Console
иJavascriptConsoleView
. - Editor - базовый редактор, обёртка над
Ace.js
- CssEditor - базовый редактор с выбранным css режимом (пока не реализован)
- HtmlEditor - базовый редактор с выбранным html режимом (пока не реализован)
- JsEditor - базовый редактор с выбранным js режимом
- Editors - контейнер для нескольких редакторов задачи
- JavascriptRunner - обёртка, выполняющая javascript-код
- Storage - обёртка над localStorage
- Timer - обёртка над setTimeout
- Timers - стандартные таймеры, таймер на автосохранение и на выполнение кода/обновление iframe-а
- XHR - обёртка для выполнения запросов к серверу