使用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属性上创建一个带有状态监视的Deferred对象。 Deferred对象都放在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请求的字段。以下是“值”更改事件生成的值。
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。他们不应该吗?
如何确定窗口小部件的值何时设置?为什么w.set('value',value)之后不是值== w.get('value')?
如果w.set('value',value)没有真正设置值,那么它是否应该返回延迟?
设定值后不应该只看火吗?
Dojo版本:
Dojo 1.6.1失败。 Watch并不总是触发并且w.get('value')!= newValue。
Dojo 1.7.2中的失败率较低。手表仍然不会总是开火,但至少是w.get('value')== newValue。
答案 0 :(得分:4)
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);
}
});