Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在实际设置值之前触发Dojo有状态监视方法_Dojo_Deferred_Stateful - Fatal编程技术网

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

在实际设置值之前触发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

使用Dojo1.6.1

更新:这里是一个jsfiddle

表单是用一些字段创建的

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