Кастумный виджет табов (Объявление класса ext.layout._TabButton наследованного от dijit.layout._TabButton с переопределением свойств и созданием методов)

59 views
Skip to first unread message

Pavel Trizno

unread,
Jun 14, 2012, 10:40:27 PM6/14/12
to ru-dojo-js...@googlegroups.com
Задача: добавить к кнопке табов "закрыть" кнопку "закрепить" которая дизейблит кнопку "закрыть" и препятствует закрытию табов.

Решение: 
1) Добавить в шаблон dijit/layout/templates/_TabButton.html разметку для кнопки и повесить на кнопку событие onclick. Здесь все просто. Шаблон выглядит так:

<div role="presentation" data-dojo-attach-point="titleNode" data-dojo-attach-event='onclick:onClick'>
    <div role="presentation" class='dijitTabInnerDiv' data-dojo-attach-point='innerDiv'>
        <div role="presentation" class='dijitTabContent' data-dojo-attach-point='tabContent'>
        <div role="presentation" data-dojo-attach-point='focusNode'>
       <img src="${_blankGif}" alt="" class="dijitIcon dijitTabButtonIcon" data-dojo-attach-point='iconNode' />
       <span data-dojo-attach-point='containerNode' class='tabLabel'></span>
       <span class="dijitInline dijitTabCloseButton dijitTabCloseIcon" data-dojo-attach-point='closeNode'
        data-dojo-attach-event='onclick: onClickCloseButton' role="presentation">
           <span data-dojo-attach-point='closeText' class='dijitTabCloseText'>[x]</span
       ></span>
<span class="dijitInline dijitTabStickButton dijitTabStickIcon" data-dojo-attach-point='stickNode' data-dojo-attach-event='onclick: onClickStickButton' role="presentation">
           <span data-dojo-attach-point='stickText' class='dijitTabStickText'>[^]</span>
</span>
</div>
        </div>
    </div>
</div>

2) Теперь требуется объявить метод onClickStickButton класса dijit.layout._TabButton все кажется просто если не брезговать хаками в коде dijit. То есть добавить в файле dijit/layout/TabController.js внутри объявления dijit.layout._TabButton новый метод:

onClickStickButton: function() {
if (this.closeButton) {
this._setCloseButtonAttr(false);
} else {
this._setCloseButtonAttr(true);
}
},

и вот оно счастье (: В принципе то что надо. НО желания править ядро dijit НЕТ. Поэтому придется расширять (в своем неймспейсе) весь TabContainer:

define([
"dojo/_base/declare", // declare
"ext/layout/TabController",
"ext/layout/ScrollingTabController",
"dijit/layout/TabContainer",
], function(lang, declare, TabController,ScrollingTabController,TabContainer){

return declare("ext.layout.TabContainer", [TabContainer], {
                // переопределяем свойство чтобы можно было использовать свой TabController
controllerWidget: "ext.layout.ScrollingTabController",
});
});

дальше начинаются проблемы:

на прямую унаследоватся от dijit.ScrollingTabControlle не удалось, сыпались ошибки, отладить которые я не сумел

define([
"dojo/_base/declare", // declare
"dijit/layout/ScrollingTabController",
"ext/layout/TabController",
], function(declare, dijitScrollingTabControlle, extTabController){

 var ScrollingTabController =  declare("ext.layout.ScrollingTabController", [dijitScrollingTabControlle,extTabController], {

});

пока что решением в "лоб" является полное копирование содержимого dijit/layout/ScrollingTabController с заменой неймспейса на ext т.е. declare("ext.layout.ScrollingTabController", [TabController, _WidgetsInTemplateMixin], {... и правкой зависимостей на TabController'а на ext/layout/TabController. 

Сам же TabController аналогичным образом пришлось практически полностью скопировать + добавить тот самый метод onClickStickButton  т.к. dijit.layout._TabButton - приватный и от него не унаследоватся.

Вопросы:
1) Правильным путем я пошел для решения задачи?
2) Правильно ли я расширил виджет с точки зрения архитектуры dijit
3) Возможно ли все же каким то образом унаследовать приватный класс (такой как dijit.layout._TabButton) 

Спасибо.





Reply all
Reply to author
Forward
0 new messages