Метод Dojo Stateful watch срабатывает до того, как значение фактически установлено

Использование Додзё 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;"
});

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

//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. Вот значения, сгенерированные в событиях изменения значения.

Свойство project_service_id: value oldValue: newValue: 1025 w.get('value'): 1025

Свойство source_address_id: value oldValue: newValue: 59 w.get('value'):

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

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

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

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

Версии Додзё:

Сбой в Додзё 1.6.1. Watch не всегда срабатывает, и когда это происходит, w.get('value') != newValue.

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


person Richard Ayotte    schedule 22.03.2012    source источник


Ответы (1)


после некоторого обсуждения с Ричардом на irc мы смогли выяснить, что между dojox.data.QueryReadStore и dijit.form.FilteringSelect есть некоторый нюанс, который предотвращает запуск обратного вызова "value" watch, если магазин еще не выполнил 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);
    }
});
person neonstalwart    schedule 24.03.2012
comment
В очередной раз благодарим за помощь. Я сделал небольшую оптимизацию, чтобы избежать загрузки всех значений. Вместо выборки я выполняю fetchItemByIdentity jsfiddle.net/rayotte/dh5pa/1. - person Richard Ayotte; 24.03.2012