Как изменить поведение Dojo TabContainer, чтобы просто открывать внешнюю ссылку вместо отображения ContentPane? - PullRequest
4 голосов
/ 15 сентября 2011

Я работаю с TabContainer, имеющим несколько разных ContentPane детей. Каждый из них снабжен параметром href для извлечения внешнего содержимого AJAX, отображаемого при выборе вкладки:

dojo.addOnLoad(function() {
    var tc_nav = new dijit.layout.TabContainer({
        style: 'width: 98%;',
        doLayout: false
    }, 'tc_nav');

    var cp1 = new dijit.layout.ContentPane({
        title: 'Test 1',
        href: 'ajax?test1',
        style: 'padding: 10px;',
        selected: true
    });

    dojo.connect(cp1, 'onShow', function() {
        cp1.refresh();
    });

    /*
     * ...
     */

    tc_nav.addChild(cp1);

    /*
     * ...
     */

    tc_nav.startup();
});

Теперь я хочу интегрировать вкладку среди других, которые должны отличаться по своему поведению: вместо загрузки контента в ContentPane вкладка должна следовать по простой ссылке в том же окне (например, <a href="http://www.google.com/">Link</a>), оставляя страница, содержащая приложение js / dojo. Я не нашел ни удовлетворительного решения, ни виджета додзё, соответствующего этому требованию. Какой будет лучший подход?

В качестве неприятного обходного пути я создал переопределенное onShow событие, запускающее window.location.href = '...';:

var cp2 = new dijit.layout.ContentPane({
    title: 'Test 2',
    style: 'padding: 10px;'
});

dojo.connect(cp2, 'onShow', function() {
    window.location.href = 'http://www.google.com/';
});

Досадным недостатком этого обходного пути является тот факт, что сначала загружается ContentPane, а затем устанавливается window.location.href, что приводит к весьма своеобразному эффекту отложенной перезагрузки и, как следствие, к плохому пользовательскому опыту. Я хотел бы избежать этого промежуточного шага.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2011

Возможный обходной путь для удовлетворения вышеупомянутых требований заключается в переопределении события onClick для ContentPane 'controlButton:

/*
 * ...
 */

var cp2 = new dijit.layout.ContentPane({
    title: 'Test 2',
    style: 'padding: 10px;'
});

/*
 * ...
 */

tc_nav.addChild(cp2);

/*
 * ...
 */

tc_nav.startup();

/*
 * ...
 */

cp2.controlButton.onClick = function() {
    window.location.href = 'http://www.google.com/';
};

Обратите внимание, что не нужно прикреплять другую функцию к событию onClick (например, dojo.connect(cp2.controlButton, 'onClick', function() { /* ... */ });), а переопределить ее, в противном случае содержимое ContentPane будет вызвано первым.

Обратите внимание, что далее startup() функция *1013* должна быть вызвана первой, чтобы сделать объект controlButton доступным.

0 голосов
/ 15 сентября 2011

ContentPanes на самом деле не являются iframes, поэтому установка window.location.href изменит URL всей вашей страницы (приложения dojo), а не только ContentPane. Вы пробовали что-то вроде этого:

cp2.set('href', 'http://www.google.com/')
...