2014-02-21 4 views
0

У меня есть 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() функция для диалога называется когда парсер заканчивается после ручного запуска. Является ли это намеренным способом сделать это, я пропущу что-то важное или я совершенно не согласен с тем, что я делаю?

ответ

1

Виджет Dialog создается программно. Таким образом, вам необходимо подключить все дочерние виджеты к диалоговому окну, прежде чем выполнять проверку на уровне диалога. Однако со второго раза он будет работать, но в первый раз он будет работать не так, как ожидалось. Чтобы преодолеть это, нам нужно вызвать метод connectChildren на Dialog перед проверкой. Это гарантирует, что все дочерние виджеты в этот момент подключены к узлу виджета Dialog.

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

Теперь проверьте результат, если это так, как ожидалось. Пожалуйста, обратитесь к обновленному jsFiddle

+0

Спасибо большое! Я не знал об этом методе. При вызове его один раз в событии onLoad в диалоговом окне все работает нормально! – Seijikun