четверг, 23 ноября 2017 г.

Реализация контроллера в JavaScript

Для сложных проектов часто необходимо создавать более сложные абстракции, чем для простых. Именно для такого сложного проекта я и делал эту реализацию контроллеров, в которых можно описывать поведение приложения.
Вся система основывется на двух классах
  1. Controller - общий класс, от которого нужно наследовать все контроллеры
  2. ContollersFactory - Фабрика, запускающая все зарегистрированные контроллеры на выполнение.
Листинг Controller
function Controller() {
};

// Запуск действий контроллера
Controller.prototype.run = function ( ) {
    var action,
        runAction;
    if (!this.hasOwnProperty('actions')) {
        throw new Error("actions is not set");
    }
    for (action in this.actions) {
        if (this.actions.hasOwnProperty(action)) {
            runAction = this.actions[action];
            runAction();
        }
    }
};
Листинг ControllersFactory
var ControllersFactory = {
    // Зарегистрированные контроллеры
    controllers: [],

    // Добавление нового контроллера в фабрику
    add: function (controllerObject) {
        this.controllers.push(controllerObject);
    },

    // Запуск всех контроллеров
    runAll: function ( ) {
        var controller;
        for (controller in this.controllers) {
            if (this.controllers.hasOwnProperty(controller)) {
                this.controllers[controller].prototype.run.apply(
                    this.controllers[controller]
                );
            }
        }
    }
};

Как с этим работать?

С этим работать очень просто нужно создать новый контроллер, унаследоваться от класса Controller и зарегистрировать новый контроллер в классе ControllersFactory.
Пример
TopController = {
    actions: {
        // События главной страницы
        indexEvents: function ( ) {
            console.log('top events');
        },
        // События на странице контактов
        contactsEvents: function ( ) {
            console.log('contacts events');
        }
    }
};

TopController.prototype = Object.create(Controller.prototype);
TopController.prototype.constructor = TopController;

ControllersFactory.add(
    TopController
);
После этих действий останется только запустить все зарегистрированные контроллеры на выполнение
$(document).ready(function() {
    ControllersFactory.runAll();
});
Этот пример конечно упрощенный и здесь нет scope пространств, в которых должен был бы работать каждый контроллер, но это не сложно доработать, например в методе Controller.run().

Комментариев нет:

Отправить комментарий

Рабочий способо убрать хрип микрофона в Ubuntu 18.04

Переходим по ссылке и делаем также как в видео https://www.reddit.com/r/Ubuntu/comments/6zq3ca/remove_background_noise_on_the_mic_in_ubun...