【问题标题】:Dojo Stateful watch method firing before value is actually setDojo Stateful watch 方法在实际设置值之前触发
【发布时间】:2012-04-07 13:16:08
【问题描述】:

使用 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 属性: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。不应该吗?

如何确定小部件的值何时设置?为什么 value == w.get('value') 不是紧跟在 w.set('value', value) 之后?

如果 w.set('value', value) 没有真正设置值,它不应该返回一个 deferred 吗?

不应该只在设置值后才观看吗?

道场版本:

在 Dojo 1.6.1 中失败。 Watch 并不总是触发,并且 w.get('value') != newValue 会触发。

在 Dojo 1.7.2 中失败较少。手表仍然不会总是触发,但至少 w.get('value') == newValue。

【问题讨论】:

    标签: dojo deferred stateful


    【解决方案1】:

    在 irc 上与richard 讨论后,我们发现dojox.data.QueryReadStoredijit.form.FilteringSelect 之间存在一些细微差别,如果商店还没有执行@ 987654326@。可行的解决方案是先执行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);
        }
    });
    

    【讨论】:

    • 再次感谢您的帮助。我做了一个小的优化以避免下载所有的值。我正在做一个 fetchItemByIdentity jsfiddle.net/rayotte/dh5pa/1 而不是 fetch
    猜你喜欢
    • 2016-03-31
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多