我有一个dijit.Dialog
,其中包含两个必须有效才能提交的元素。 Dialog是以编程方式创建的,而它的内容是在构造函数的选项哈希中指定的。内容确实包含声明性小部件,对话框的参数parseOnLoad
设置为true
,以便解析器(应该)实例化所有小部件,然后调用其启动方法。在创建对话框的实例后,我注册了一个回调以更改验证状态:
var dialog = new Dialog({
title: 'Login',
parseOnLoad: true,
content: dialogContent
});
dialog.watch('state', function(){
//is never called when changing the input fields.
//onValidStateChange is not being fired either.
});
dialog.startup();
dialog.show();
dialogContent
定义如下:
<div class="dijitDialogPaneContentArea">
<table>
<tr>
<td>CustomerID: </td>
<td><div name="user" required="true" trim="true" data-dojo-type="dijit/form/NumberTextBox" data-dojo-props="pattern: '[0-9]{5,7}', _formatter: function(){}"></div></td>
</tr>
<tr>
<td>Password: </td>
<td><div name="password" type="password" required="true" data-dojo-type="dijit/form/ValidationTextBox"></div></td>
</tr>
</table>
</div>
<div class="dijitDialogPaneActionBar">
<div data-dojo-type="dojox/form/BusyButton" type="submit" data-dojo-props="disabled: true">OK</div>
</div>
以下是情况的JSFiddle:http://jsfiddle.net/rSbZP/3/
就像在validation-callback方法中提到的那样:它永远不会被对话框调用/触发。无论输入字段的内容是什么,调用对话框的isValid()
函数总是返回true,而validate()
函数总是返回正确的结果。对话框的result
属性始终为空字符串。经过几个小时的测试后,我发现当我再次手动调用对话框的startup()
方法时,它突然开始工作。我还认识到对话框显示 之前 其小部件正在实现并显示(大约1秒后发生),因此对话框的startup()
方法在子窗口小部件被实例化之前被调用(所以子窗口小部件没有被启动,我猜想?)。所以我尝试为自动调用的解析器注册一个回调来手动调用startup()
方法,但是我找不到Promise
或其他任何要注册的方法。
过了一段时间,我发现了这个解决方法(我使用对话框的onShow
事件来手动启动解析器并向其注册回调):
var dialog = new Dialog({
title: 'Login',
parseOnLoad: false,
content: dialogContent,
onShow: function(){
parser.parse().then(function(){
dialog.startup();
});
}
});
通过执行此操作,在手动启动解析器后,将调用对话框的startup()
函数。
这是否有意这样做,我是否遗漏了一些重要信息,或者我对自己所做的事情完全错了?
答案 0 :(得分:1)
Dialog小部件以编程方式创建。因此,在对话级别进行验证之前,需要将所有子窗口小部件连接到Dialog。但是,从第二次起,它将起作用,但是第一次,它将无法按预期工作。为了解决这个问题,我们需要调用&#34; connectChildren&#34;验证前对话的方法。这将确保该时刻的所有子窗口小部件都连接到Dialog窗口小部件节点。
testValid = function () {
dialog.connectChildren();
alert(dialog.isValid());
};
testValidate = function () {
dialog.connectChildren();
alert(dialog.validate());
};
现在检查结果是否符合预期。请参阅更新后的jsFiddle