Компоненты

Компоненты — это главные строительные блоки приложений основанных на Jii. Компоненты наследуются от класса [[Jii.base.Component]] или его наследников. Три главные возможности, которые компоненты предоставляют для других классов:

Как по отдельности, так и вместе, эти возможности делают классы Jii более простыми в настройке и использовании.

Компоненты — очень мощный инструмент. Но в то же время они немного тяжелее обычных объектов, потому что на поддержку событий и поведений тратится дополнительные память и процессорное время. Если ваши компоненты не нуждаются в этих двух возможностях, вам стоит унаследовать их от [[Jii.base.Object]], а не от [[Jii.base.Component]]. Поступив так, вы сделаете ваши компоненты такими же эффективными, как и обычные PHP объекты, но с поддержкой свойств.

При наследовании ваших классов от [[Jii.base.Component]] или [[Jii.base.Object]], рекомендуется следовать некоторым соглашениям:

  • Обязательно вызывайте родительский конструктор, передавая туда config.
  • Всегда вызывайте конструктор предка в конце вашего переопределенного конструктора.
  • Если вы переопределяете метод [[Jii.base.Object.init()]], убедитесь, что вы вызываете родительскую реализацию этого метода в начале вашего метода init().

Пример:

var Jii = require('jii');

/**
 * @class app.components.MyClass
 * @extends Jii.base.Object
 */
Jii.defineClass('app.components.MyClass', /** @lends app.components.MyClass.prototype */{

    __extends: 'Jii.base.Object',
    
    prop1: null,
    prop2: null,

    constructor: function(param1, param2, config) {
        config = config || {};
        
        // ... инициализация происходит перед тем, как будет применена конфигурация.
        
        this.__super(config);
    },
    
    init: function() {
        this.__super();
        
        // ... инициализация происходит после того, как была применена конфигурация.
    }

});

Следуя этому руководству вы позволите настраивать ваш компонент при создании. Например:

var component = new app.components.MyClass(1, 2,{prop1: 3, prop2: 4});
// альтернативный способ
var component = Jii.createObject({
    className: app.components.MyClass.className(),
    prop1: 3,
    prop2: 4,
}, [1, 2]);

Жизненный цикл объектов класса [[Jii.base.Object]] содержит следующие этапы:

  1. Предварительная инициализация в конструкторе. Здесь вы можете установить значения свойств по умолчанию.
  2. Конфигурация объекта с помощью config. Во время конфигурации могут быть перезаписаны значения свойств по умолчанию, установленные в конструкторе.
  3. Конфигурация после инициализации в методе [[Jii.base.Object.init()]]. Вы можете переопределить этот метод, для проверки готовности объекта и нормализации свойств.
  4. Вызов методов объекта.

Первые три шага всегда выполняются из конструктора объекта. Это значит, что если вы получите экземпляр объекта, он уже будет проинициализирован и готов к работе.