Задача: добавить к кнопке табов "закрыть" кнопку "закрепить" которая дизейблит кнопку "закрыть" и препятствует закрытию табов.
Решение:
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)
Спасибо.