dijit.Dialog isValid проверка всегда верна
У меня есть dijit.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/
Как упомянуто в методе проверки-обратного вызова: это никогда не вызывается / запускается диалогом. Вызов 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 ответ
Виджет Диалог создан программно. Итак, вам необходимо подключить все дочерние виджеты к диалогу, прежде чем выполнять проверку на уровне диалога. Однако со второго раза он будет работать, но в первый раз он не будет работать, как ожидалось. Чтобы преодолеть это, нам нужно вызвать метод connectChildren в диалоге перед проверкой. Это обеспечит подключение всех дочерних виджетов в этот момент к узлу виджета Dialog.
testValid = function () {
dialog.connectChildren();
alert(dialog.isValid());
};
testValidate = function () {
dialog.connectChildren();
alert(dialog.validate());
};
Теперь проверьте результат, если он соответствует ожиданиям. Пожалуйста, обратитесь к обновленному jsFiddle