2012-03-09 2 views
0

Я обнаружил, что вы не можете связывать цепочку с последовательным поведением. В приведенном ниже коде вызывается метод onCustomClick в виджете, но связанная с ним функция не вызывается. Обходной путь, который у меня есть, - это то, что я сделал с onCustomClick2, где я присоединяю событие к внутреннему методу, который просто вызывает другой метод. Есть ли способ написать этот код, не имея внутреннего метода?Chaining dojo.connect

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Dojo Connect Issue</title> 
</head> 
<body> 

<div id="content"></div> 

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7/dojo/dojo.js" data-dojo-config="isDebug: true"></script> 
<script type="text/javascript"> 
    require(["dojo/domReady!", "dojo/parser", "dijit/_Widget", "dijit/_Templated"], function(dr, p, w, t) { 

     dojo.declare("W1", [w, t], { 

      templateString: '<div>Click Me</div>', 

      postCreate: function() { 
       this.inherited(arguments); 
       this.connect(this.domNode, 'onclick', this.onCustomClick); 
       this.connect(this.domNode, 'onclick', this._onCustomClick2); 
      }, 

      onCustomClick: function() { 
       console.debug('onCustomClick'); 
      }, 

      _onCustomClick2: function() { 
       this.onCustomClick2(); 
      }, 

      onCustomClick2: function() { 
       console.debug('onCustomClick2'); 
      }, 
     }); 

     var w = new W1({}, dojo.byId('content')); 

     dojo.connect(w, 'onCustomClick', function() { 
      console.debug('End Consumer - onCustomClick'); // never gets called??? 
     }); 
     dojo.connect(w, 'onCustomClick2', function() { 
      console.debug('End Consumer - onCustomClick2'); 
     }); 
     w.startup(); 

    }); 
    </script> 
</body> 
</html> 

ответ

2

dojo.connect работает переопределение метода с новой функцией, которая вызывает старый (и метод вы связывание) Таким образом, на основании порядка исполнения здесь, связывается с пост-созданием одного определения onCustomClick, то dojo.connect связывается с другим. Попробуйте использовать подпись на соединение, что будет делать ленивый поиск метода onCustomClick: (отредактированный с коррекцией Крейга)

dojo.connect(this.domNode, 'onclick', this, 'onCustomClick');

+1

this.connect (this.domNode, 'onclick', 'onCustomClick'); это правильный синтаксис, это было бы необходимо, если бы я делал dojo.connect, но ваше объяснение было правильным. Благодарю. –

0

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

postCreate: function() { 
    this.inherited(arguments); 
    dojo.connect(this.domNode, 'onclick', this, function(event) { 
    this.onCustomClick(event); 
    this._onCustomClick2(event); 
    }); 
} 

Также отметим, что нет this.connect обеспечивается за счет использования dojo.declare для создания объекта, вы все равно должны использовать dojo.connect.

В качестве альтернативы, если формирование цепочки является то, что вы действительно хотите, то попробуйте оборачивать объект в dojo.nodeList, который следует шаблону строителя и позволит вам цепные звонкам (я не проверял следующий):

var w = new W1({}, dojo.byId('content')); 

new dojo.NodeList(w). 
    .connect('onCustomClick', dojo.hitch(w, w.onCustomClick)) 
    .connect('onCustomClick2', dojo.hitch(w, w.onCustomClick2)); 

w.startup(); 
+0

Код, который я опубликовал, является общей версией моего варианта использования. Цепочка, на которую я ссылаюсь, - это не onCustomClick и onCustomClick2, а скорее то, что я подключаю событие onclick к методу onCustomClick виджета, а затем попытаюсь подключить метод onCustomClick к виджету к другой функции вне виджета. OnCustomClick2 просто демонстрирует мое обходное решение. W1 расширяет _Widget и получает this.connect оттуда (через _WidgetBase). –

+0

Моим вариантом использования является то, что у меня есть виджет, который пользователь нажимает на область. Этот виджет используется в двух местах, и поведение того, что должно произойти, зависит от родительского контейнера. Поэтому я хочу, чтобы родительский контейнер подключался к методу и выполнял соответствующие функции –