data-dojo-observer программно

120 views
Skip to first unread message

Ильдар Гильфанов

unread,
Mar 28, 2014, 3:52:41 AM3/28/14
to ru-dojo-js...@googlegroups.com


 Как такую кострукцию написать программно в пределах виджета ? :

 <input type="checkbox" name="foo" data-dojo-observer="showValues, logRadio" />
 <script type="dojo/method" data-dojo-event="showValues" data-dojo-args="value,name">
    if(name){
        console.log("name = ", name, " value = ", value);
    }
 </script>

http://dojotoolkit.org/documentation/tutorials/1.9/form_manager/

Спасибо!

Eugene Lazutkin

unread,
Mar 30, 2014, 1:48:39 PM3/30/14
to ru-dojo-js...@googlegroups.com
Ну можно по простому написать:

function showValues(name, value){
  if(name){
    console.log("name = ", name, " value = ", value);
  }
}

var chk = byId("myCheckbox");
var h = on(chk, "click", function(evt){
  showValues(chk.name, Boolean(chk.checked));
});

Всё что form manager делает, это исполняет такой код при регистрации ноды.

Cheers,

Eugene

Ильдар Гильфанов

unread,
Mar 30, 2014, 2:10:09 PM3/30/14
to ru-dojo-js...@googlegroups.com
В идеале хотелось чтобы можно было мониторить любое изменение значения value виджетов (вне зависимости от вида и типа, например:

dijit.form.FilteringSelect, dijit/form/DateTextBox и т.п.) в одном методе


воскресенье, 30 марта 2014 г., 21:48:39 UTC+4 пользователь Eugene Lazutkin написал:

Eugene Lazutkin

unread,
Apr 8, 2014, 4:05:49 PM4/8/14
to ru-dojo-js...@googlegroups.com
Извиняюсь за пропадание.

Вообще-то Manager сделан как набор миксинов, которые можно просто подмешать к существующему виджету. Просто добавить что нужно (_Mixin, _NodeMixin, вспомогательные миксины), сформировать нужный DOM (например, через правильный темплет), и --- вперёд! startup() сделает что нужно.

Можно и руками низкоуровнево. Каждый элемент сначала регистрируется (registerWidget/registerNode), а затем к нему присоединяются observers (connectWidget/connectNode). Проблема в том, что это приватные функции (приватность опять наносит ответный удар --- за это я её и не люблю) и единственный способ их использовать это или поменять имплементацию сделав их публичными, либо скопировать в свой код. И то и другое обрекает программиста на постоянные апдейты с каждой новой версией --- вдруг там что поменялось.

Разумеется есть публичные функции registerWidget/registerNode, но они не позволяют специфицировать список observers и берут его в текстовой форме из виджета/ноды. Если это подходит, то проще сформировать то что нужно руками (имена наблюдателей это имена соответственных функций на самом виджете) и зарегистрировать по мере необходимости.

Cheers,

Eugene

Ильдар Гильфанов

unread,
Apr 9, 2014, 2:39:41 AM4/9/14
to ru-dojo-js...@googlegroups.com

var changeEvent = function(){
   
};

dojo.forEach(this.form.getDescendants(), function(widget) {

    if (widget.id && widget.id.indexOf('ListInput') != -1) {

        //dojox/form/ListInput - с этим виджетом вообще печально
        //1. не развивается;
        //2. value не принимает ключ-значение, а только значение;
        //3. onChange корректно не работает.

        aspect.after(widget, "_updateValues", changeEvent);

    } else if (widget.dojoAttachPoint && widget.dojoAttachPoint.indexOf('date') != -1) {

        widget.watch('displayedValue', changeEvent);

    } else if (widget.type == 'checkbox') {

        widget.on("click", changeEvent);

    }else if (widget.id && widget.id.indexOf('ValidationTextBox') != -1) {
       
        // у widget-а dijit/form/ValidationTextBox метод onChange работает только тогда,
        // когда курсор покидает форму       
        widget.watch('displayedValue', changeEvent);   
    }

});

среда, 9 апреля 2014 г., 0:05:49 UTC+4 пользователь Eugene Lazutkin написал:

Eugene Lazutkin

unread,
Apr 15, 2014, 4:40:33 PM4/15/14
to ru-dojo-js...@googlegroups.com
Похоже что за последнее время форм виджеты "разъехались". Наверно надо зафайлить тикет про это. Проблема в целом конечно концептуальная --- необходимо стандартизировать события форм виджетов для унификации их оркестрирования в формах. Причём как с технической (какие события бывают), так и с пользовательской точки зрения (когда именно события происходят).

Cheers,

Eugene

Ильдар Гильфанов

unread,
Dec 20, 2014, 5:08:09 AM12/20/14
to ru-dojo-js...@googlegroups.com
Недавно сделал наблюдение:  конструкция 

this.form.on('validStateChange', function(isValid) {
      buttonLogin
.set("disabled", !isValid);
});



не всегда работает.

Вместо этой конструкции, написал так:

var sender = this;

var changeEvent = function(){
    buttonLogin
.set("disabled", sender.userBox.get('value')=='' && sender.passwordBox.get('value')=='' );
};

 
this.userBox.watch('displayedValue', changeEvent);

this.passwordBox.watch('displayedValue', changeEvent);


Reply all
Reply to author
Forward
0 new messages