dijit.Dialog isValid检查总是如此

时间:2014-02-21 18:39:25

标签: javascript forms validation dojo dojo-1.9

我有一个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()函数。 这是否有意这样做,我是否遗漏了一些重要信息,或者我对自己所做的事情完全错了?

1 个答案:

答案 0 :(得分:1)

Dialog小部件以编程方式创建。因此,在对话级别进行验证之前,需要将所有子窗口小部件连接到Dialog。但是,从第二次起,它将起作用,但是第一次,它将无法按预期工作。为了解决这个问题,我们需要调用&#34; connectChildren&#34;验证前对话的方法。这将确保该时刻的所有子窗口小部件都连接到Dialog窗口小部件节点。

testValid = function () {
    dialog.connectChildren();
    alert(dialog.isValid());
};
testValidate = function () {
    dialog.connectChildren();
    alert(dialog.validate());
};

现在检查结果是否符合预期。请参阅更新后的jsFiddle