Dojo Stateful watch метод запуска до фактического задания значения - PullRequest
3 голосов
/ 23 марта 2012

Использование Dojo 1.6.1.

Обновление: Здесь jsfiddle http://jsfiddle.net/E4EaM/1/

Форма создается с некоторыми полями.

this.projectServiceidField = new dijit.form.TextBox({
    label: 'idField'
    , name: 'project_service_id'
    , required: true
    , type: 'hidden'
}).placeAt(this.domNode);

this.projectServiceEquipmentSourceAddress = new dijit.form.FilteringSelect({
    name: 'source_address_id'
    , required: true
    , store: model.CustomerAddressesPairsView
    , searchAttr: "name"
    , style: "width: 40ex;"
});

Приложение должно быть уведомлено, когда все значения виджета были установлены.Для этого создается отложенный объект с наблюдением Stateful в свойстве value виджета.Все отложенные объекты помещаются в DeferredList.Как только значение виджета было изначально установлено, часы удаляются, и его отложенный объект разрешается.

//loop 
w.deferred = new dojo.Deferred();
da.push(w.deferred);

// Watch the widget's value
w.initWatch = w.watch('value', function(property, oldValue, newValue) {
    w.initWatch.unwatch();
    console.debug(w.name, 'property:', property, 'oldValue:', oldValue,'newValue:', newValue,'w.get(\'value\'):', w.get('value'));
    w.deferred.resolve();
});

// Set the widget's value
w.set('value', value);

//endloop

var dl = new dojo.DeferredList(da);

Когда разрешен DeferredList, все значения виджета должны быть установлены.

dl.then(
    function() {
        dojo.forEach(da, function(d) {
            console.debug(Date.now(), d);
        })

        console.debug(Date.now(), dl, 'DeferredList resolved -------->', form.getValues());
        console.debug(form.getValues());
    }
);

Но это не работает, как ожидалось.В частности, поля, которые делают запросы xhr.Вот значения, сгенерированные для событий изменения 'value'.

project_service_id свойство: значение oldValue: newValue: 1025 w.get ('значение'): 1025

source_address_id свойство: значение oldValue: newValue: 59 w.get ('value '):

source_address_id должен был иметь значение 59, но когда я w.get (' value '), оно не равно newValue.Разве они не должны быть?

Как я могу определить, когда было установлено значение виджета?Почему не значение == w.get ('значение') сразу после w.set ('значение', значение)?

Если w.set ('значение', значение) на самом деле не устанавливаетзначение, разве оно не должно возвращать отложенное?

Разве не следует смотреть только огонь после того, как значение было установлено?

Версии Dojo:

Сбои в додзё 1.6.1.Часы не всегда запускаются, и w.get ('value')! = NewValue, когда это происходит.

Сбой в Dojo 1.7.2.Часы по-прежнему не всегда срабатывают, но, по крайней мере, w.get ('value') == newValue.

1 Ответ

4 голосов
/ 24 марта 2012

после некоторого разговора с Ричардом по irc, мы смогли выяснить, что был некоторый нюанс между dojox.data.QueryReadStore и dijit.form.FilteringSelect, который препятствовал срабатыванию обратного вызова "value", если магазин еще не сделал fetch. рабочим решением было сначала сделать fetch, а затем создать виджет в обратном вызове onComplete - см. http://jsfiddle.net/neonstalwart/dEC7M/

соответствующая часть

customerAddressesPairsView.fetch({
    onComplete: function() {
        var w = new dijit.form.FilteringSelect({
            name: 'source_address_id',
            required: true,
            store: customerAddressesPairsView,
            searchAttr: "name",
            style: "width: 40ex;"
        }, 'sourceAddress');

        var handle = w.watch(function(property, oldValue, newValue) {
            console.log(property, oldValue, newValue);
        });

        w.set("value", value1);
        console.debug('Value set to ' + value1);
        console.debug('Immediate get returns:', w.get('value'));
        console.debug('Direct access returns: ' + w.value);
    }
});
...