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