не может назначить событие onclick внутри пользовательского виджета Dojo - PullRequest
0 голосов
/ 08 марта 2012

У меня есть пользовательский виджет, определенный примерно так:

dojo.declare('myWidget', [dijit._WidgetBase, dijit._Templated],
{
    'templateString':'<span>' +
            '<a  dojoAttachPoint="linkNode" href="blah.php">' +
                '<img class="thumbNail" src="blahthumb.php" />' +
            '</a>' +
            '<h4 dojoAttachPoint="title" class="title">${blahtitle}</h4>' +
        '</span>',
    'stuff':null,
    'startup':function()
    {
        dojo.connect(this.linkNode, 'onclick', function(e){dojo.stopEvent(e);alert('hi');});
    }
});

Как вы можете видеть, я пытаюсь назначить событие onclick для части пользовательского виджета.Я создаю виджет программно и помещаю его на страницу, подобную следующей:

...
    f = new myWidget(stuff);
    f.startup();    
    li = dojo.create('li', {'class':'thingy'});
    dojo.place(f.domNode, li);
    dojo.place(li, this.gallery); // within another widget,
...

К сожалению, событие onclick, подключаемое в методе запуска, не запускается.Я пытался назначить его по-разному, кажется, ничего не работает.

Я что-то не так делаю?

Ответы [ 2 ]

0 голосов
/ 09 марта 2012

Я наконец понял это. Это не было связано с тем, как я создавал виджет, так как я выполнял функцию, которая изменяла виджет сразу после его запуска. Не уверен, ПОЧЕМУ это вызвало исчезновение событий onclick, но он изменял свойство innerHTML некоторых dom-узлов виджетов. Когда я комментирую этот раздел, все работает великолепно.

0 голосов
/ 08 марта 2012

Я не могу с уверенностью сказать, почему ваш случай не работает, возможно, это потому, что вы не передаете вызов метода при запуске, добавляя this.inherited(arguments); в конец метода.

Однако в вашем случае я думаю, что другой подход может быть более подходящим. В дополнение к функциональности вокруг dojoAttachPoint, о которой вы, очевидно, знаете, у dojo также есть dojoAttachEvent. Я бы посоветовал вам сделать это примерно так:

dojo.declare('myWidget', [dijit._WidgetBase, dijit._Templated],
{
    'templateString':
        '<span>' +
            '<a dojoAttachEvent="onClick:_linkNodeClick" href="blah.php">' +
                '<img class="thumbNail" src="blahthumb.php" />' +
            '</a>' +
            '<h4 dojoAttachPoint="title" class="title">${blahtitle}</h4>' +
        '</span>',

    'stuff':null,

    '_linkNodeClick':function(e){
        dojo.stopEvent(e);
        alert('hi');
    }
});

Редактировать

Окей, я попробовал сам сейчас и смог заставить его работать так:

dojo.provide("MyWidget");
dojo.declare('MyWidget', [dijit._Widget, dijit._Templated],
{
    'templateString':
        '<span>' +
            '<a dojoAttachPoint="linkNode">' +
                '<img class="thumbNail" src="blahthumb.php" />' +
            '</a>' +
            '<h4 dojoAttachPoint="title" class="title">${blahtitle}</h4>' +
        '</span>',

    'startup':function()
    {
        dojo.connect(this.linkNode, 'onclick', function(e){dojo.stopEvent(e);alert('hi');});
    }
});

И чтобы запустить его, мне пришлось подключить его к DOM перед вызовом автозагрузки.

var f = new MyWidget();
dojo.body().appendChild(f.domNode);
f.startup();

Единственное, что я изменил из твоего оригинала, это добавил dojo.provide (...), и я не знаю, действительно ли это было важно. Тогда я использовал _Widget вместо _WidgetBase. А затем также измените порядок, как я уже упоминал. Теперь, когда я нажимаю на изображение, появляется предупреждение «Привет», а затем ссылка не переходит.

...