使用 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;"
});
设置所有小部件值后,需要通知应用程序。为此,在小部件的 'value 属性上使用 Stateful watch 创建了一个 Deferred 对象。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属性:值oldValue:newValue:1025 w.get('value'):1025
source_address_id属性:值oldValue:newValue:59 w.get('value'):
source_address_id 应该有一个值 59,但是当我 w.get('value') 时,它不等于 newValue。他们不应该吗?
如何确定小部件的值何时设置?为什么 value == w.get('value') 不是紧跟在 w.set('value', value) 之后?
如果 w.set('value', value) 没有真正设置值,它不应该返回延迟吗?
设置值后不应该只看火吗?
道场版本:
在 Dojo 1.6.1 中失败。Watch 并不总是触发并且 w.get('value') != newValue 触发。
在 Dojo 1.7.2 中失败较少。手表仍然不会总是触发,但至少 w.get('value') == newValue。