Доброго времени суток всем читателям! В данном топике я поделюсь своим опытом создания виджетов на Dojo на примере числового LED-индикатора (часов, таймера и пр.). Я не буду углубляться в историю создания фреймворка и теорию — топик носит практический характер.
Итак, начнём.
Как известно, JavaScript не имеет нативной поддержки классов и практически каждый JS-фреймворк так или иначе решает эту проблему.
В Dojo для этого используется конструкция следующего вида
Наш виджет будет наследовать два класса — базовый dijit._Widget и dijit._Templated, назначение которого состоит в создании DOM-узла из шаблона, определённого в данном случае в параметре
templateString.
Класс dijit._Widget предоставляет несколько специальных методов (с их списком вы можете ознакомиться здесь), мы воспользуемся методом postCreate, вызываемом после создания виджета и переопределим его.
В этом методе мы запоминаем коллекцию узлов, содержащихся в containerNode (значение атрибута dojoAttachPoint) с классом digit (элементы span, которые и будут отображать цифры) и вызываем пользовательский метод render.
Метод render вызывается каждый раз при изменении значения индикатора (метод setValue). В нём мы проходим по сохранённой коллекции узлов и назначаем каждому элементу соответствующий класс (digit_0, digit_1,… digit_9). Реализация метода не нуждается в детальном пояснении, поэтому приведу полный код виджета:
На этом пожалуй всё, теперь мы можем создать экземпляр виджета с помощью разметки
Я не буду приводить CSS — как вы наверное уже догадались, у всех узлов коллекции один бэкграунд с цифрами, но по разному спозиционированный.
Есть два пути создания виджета для Dojo — декларативный и программный.
Декларативный метод заключается в создании виджета из HTML-разметки. Его преимущество — простота и скорость разработки, недостаток — сканирование DOM-дерева существенно снижает скорость загрузки объёмных страниц. Таким образом, декларативный метод может оказаться весьма полезным при прототипировании веб-приложения, в рабочей же версии рекомендуется использовать программный метод.
Немного об этих методах вы можете найти здесь.
Статья не претендует на полноту и гениальность, но тем не менее, надеюсь она будет вам полезна.
Итак, начнём.
Как известно, JavaScript не имеет нативной поддержки классов и практически каждый JS-фреймворк так или иначе решает эту проблему.
В Dojo для этого используется конструкция следующего вида
dojo.declare( 'имя класса', [родитель1,родитель2,...], { свойства/методы } );
Наш виджет будет наследовать два класса — базовый dijit._Widget и dijit._Templated, назначение которого состоит в создании DOM-узла из шаблона, определённого в данном случае в параметре
templateString.
Класс dijit._Widget предоставляет несколько специальных методов (с их списком вы можете ознакомиться здесь), мы воспользуемся методом postCreate, вызываемом после создания виджета и переопределим его.
postCreate : function () { this.digits = dojo.query('.digit', this.containerNode); this.render(); },
В этом методе мы запоминаем коллекцию узлов, содержащихся в containerNode (значение атрибута dojoAttachPoint) с классом digit (элементы span, которые и будут отображать цифры) и вызываем пользовательский метод render.
Метод render вызывается каждый раз при изменении значения индикатора (метод setValue). В нём мы проходим по сохранённой коллекции узлов и назначаем каждому элементу соответствующий класс (digit_0, digit_1,… digit_9). Реализация метода не нуждается в детальном пояснении, поэтому приведу полный код виджета:
dojo.declare( 'LedIndicator', [dijit._Widget,dijit._Templated], { currentValue : '000000', templateString: "<div>" + '<span class="led" dojoAttachPoint="containerNode">' + '<span class="digits"><span class="digit"></span><span class="digit"></span></span>' + '<span class="digits"><span class="digit"></span><span class="digit"></span></span>' + '<span class="digits"><span class="digit"></span><span class="digit"></span></span>' + "</div>" , postCreate : function () { this.digits = dojo.query('.digit', this.containerNode); this.render(); }, render : function () { var i = 0; var dc = Math.min(this.digits.length, this.currentValue.length); this.digits.removeClass(); for (i=0; i < dc; i++) { dojo.addClass(this.digits[i],'digit_'+this.currentValue.charAt(i)); } }, setValue : function (value) { this.currentValue = value; this.render(); } } );
На этом пожалуй всё, теперь мы можем создать экземпляр виджета с помощью разметки
<div dojoType="LedIndicator" id="led_1" class="led"></div>
Я не буду приводить CSS — как вы наверное уже догадались, у всех узлов коллекции один бэкграунд с цифрами, но по разному спозиционированный.
Заключение
Есть два пути создания виджета для Dojo — декларативный и программный.
Декларативный метод заключается в создании виджета из HTML-разметки. Его преимущество — простота и скорость разработки, недостаток — сканирование DOM-дерева существенно снижает скорость загрузки объёмных страниц. Таким образом, декларативный метод может оказаться весьма полезным при прототипировании веб-приложения, в рабочей же версии рекомендуется использовать программный метод.
Немного об этих методах вы можете найти здесь.
Статья не претендует на полноту и гениальность, но тем не менее, надеюсь она будет вам полезна.