在实际设置值之前触发Dojo有状态监视方法
使用Dojo1.6.1 更新:这里是一个jsfiddle 表单是用一些字段创建的在实际设置值之前触发Dojo有状态监视方法,dojo,deferred,stateful,Dojo,Deferred,Stateful,使用Dojo1.6.1 更新:这里是一个jsfiddle 表单是用一些字段创建的 this.projectServiceidField = new dijit.form.TextBox({ label: 'idField' , name: 'project_service_id' , required: true , type: 'hidden' }).placeAt(this.domNode); this.projectServiceEquipmentSour
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;"
});
当所有小部件值都设置好时,需要通知应用程序。为此,在小部件的“值”属性上创建一个延迟对象,并使用有状态监视。延迟对象都放在延迟列表中。一旦一个小部件的值被初始设置,手表被移除,它的延迟对象被解析
//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);
解析延迟列表时,应设置所有小部件值
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\u service\u id属性:value旧值:新值:1025w.get('value'):1025
源地址\u id属性:值旧值:新值:59w.get('value'):
source_address_id应该有一个值59,但当I w.get('value')时,它不等于newValue。他们不应该这样吗
如何确定小部件的值是何时设置的?为什么value==w.get('value')不紧跟在w.set('value',value'之后
如果w.set('value',value)没有真正设置值,那么它不应该返回延迟值吗
不应该只在设置了值后才观看火灾吗
Dojo版本:
在Dojo1.6.1中失败。手表不一定会开火,而且会得到(“值”)!=当它这样做的时候,它就有了新的价值
在Dojo1.7.2中失败较少。手表仍然不会一直启动,但至少w.get('value')==newValue。在与richard讨论irc后,我们发现
dojox.data.QueryReadStore
和dijit.form.FilteringSelect
之间存在一些细微差别,从而阻止了“值”
如果存储尚未执行获取操作,则监视将触发的回调。工作解决方案是首先执行获取
,然后在onComplete
回调中创建小部件-请参阅
相关部分是
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);
}
});
再次感谢你的帮助。我做了一个小优化,以避免下载所有的值。我正在执行fetchItemByIdentity,而不是fetch