在实际设置值之前触发的Dojo状态监视方法

时间:2012-03-22 22:20:03

标签: dojo deferred stateful

使用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。

1 个答案:

答案 0 :(得分:4)

经过与richard在irc上的一些讨论后,我们能够发现dojox.data.QueryReadStoredijit.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);
    }
});