dojo.connect не будет соединяться с помощью кнопки «onclick» - PullRequest
6 голосов
/ 09 июня 2010

У меня проблема с использованием dojo.connect () для подключения события onclick с помощью этой кнопки:

<button dojoType="dijit.form.Button" widgetId="inbox_button" id="inbox_button">Inbox</button>

и код соединения:

var inbox_button=dojo.byId("inbox_button");
dojo.connect(inbox_button,'onclick',function(){
    var container=dijit.byId("center");
    container.addChild(new dijit.layout.ContentPane({region: "left", content: "...", style: "width: 100px;"}))
});

Однако вместо того, чтобы выполнять функцию при нажатии кнопки, ЛЮБОЕ событие onclick вызывает функцию, и я получаю много дочерних контейнеров.

Несмотря на то, что я почти уверен, что функция .connect () должна быть доступна как часть базовой функциональности dojo, я явно "потребовал" ее:

dojo.require("dojo._base.connect");

Есть идеи относительно того, почему это может происходить?

Ответы [ 2 ]

12 голосов
/ 15 июня 2010

Как вы говорите, если вы запустите этот код до того, как DOM будет готов, dojo.byId ("inbox_button") вернет ноль. Итак, ваше соединение на самом деле делает:

dojo.connect(null, "onclick", function() { ... })

.. если 1-й аргумент dojo.connect равен null, будет использоваться глобальный или оконный объект.

Но это только одна ошибка. Ваш элемент кнопки становится виджетом и превращается в dijit.form.Button. Таким образом, вы должны подключаться к методу onClick здесь, а не к onclick узла:

dojo.connect(dijit.byId("inbox_button"), "onClick", function() { ... });

Кроме того, чтобы быть ясным, вам никогда не нужно делать dojo.require в dojo._base, это обещание, которое дает вам dojo.js - все это входит в комплект.

2 голосов
/ 10 июня 2010

Чтобы ответить на мой собственный вопрос: никогда не стоит недооценивать ценность dojo.addOnLoad!

Мне кажется, что поскольку кнопка использовалась в качестве виджета, ее идентификатор не был зарегистрирован до тех пор, пока Dojo не завершил загрузку, а поскольку код подключения не был в блоке addOnLoad, он не смог найти (пока нет загружена) кнопка. Следовательно, причина того, что метод запускался при каждом событии щелчка, заключалась в том, что Dojo работает с нулевыми объектами в функции connect (): он игнорирует их и вместо этого использует dojo.global (версия document.window для Dojo) в качестве объект.

Надеюсь, это поможет любому, кто сталкивался с подобной проблемой!

...