3

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

4

1 回答 1

4

dojox.data.QueryReadStore在 irc 上与richard 进行了一些讨论后,我们发现两者之间存在一些细微差别,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);
    }
});
于 2012-03-24T02:11:38.267 回答