У меня есть dijit.Dialog
с двумя элементами, которые должны быть действительны, чтобы отправить его. Диалог создается программно, пока его содержимое указано в хэш-настройках конструктора. Содержимое содержит декларативные виджеты, а параметр диалога parseOnLoad
установлен в true
, так что синтаксический анализатор (должен) создает все виджеты, а затем вызывает их метод запуска. После создания экземпляра диалога, я зарегистрировал функцию обратного вызова для изменения состояния проверки:dijit.Dialog isValid check always 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()
функция для диалога называется когда парсер заканчивается после ручного запуска. Является ли это намеренным способом сделать это, я пропущу что-то важное или я совершенно не согласен с тем, что я делаю?
Спасибо большое! Я не знал об этом методе. При вызове его один раз в событии onLoad в диалоговом окне все работает нормально! – Seijikun