Запретить закрытие aurelia-dialog

#aurelia

#aurelia

Вопрос:

Привет, я могу запустить базовый диалог, но я хотел бы сохранить диалог и закрыть его сам. Возможно ли это?

Текущее нажатие на кнопку OK немедленно удаляет диалоговое окно.

В принципе, я хочу, чтобы диалоговое окно представляло собой окно входа с именем пользователя / паролем. При неудачных попытках входа в систему я хотел бы отобразить сообщение об ошибке в диалоговом окне, а не закрывать его.

Мой шаблон

 <template>
  <ai-dialog>
    <ai-dialog-header>
    </ai-dialog-header>
    <ai-dialog-body>
      <h2>Username:</h2>
      <input value.bind="auth.username" attach-focus="true" />
      <br />
      <h2>Password:</h2>
      <input value.bind="auth.password" attach-focus="false" />
      <br /><br />
      <span innerhtml.bind="auth.error">No Error</span>
    </ai-dialog-body>
    <ai-dialog-footer>
      <button click.trigger="controller.ok(auth)">Ok</button>
    </ai-dialog-footer>
  </ai-dialog>
</template>
  

и модель

 import {DialogController} from 'aurelia-dialog';

export class Login {
  static inject = [DialogController];
  auth = { username: '', password: '', error: '' };

  constructor(private controller : DialogController){

    this.controller = controller;
  }

  activate(auth){
    this.auth = auth;
  }
}
  

Я вызываю из другого модуля, например

 let auth = { username: 'Wade', password: 'Watts', error : ""};

  this.dialogService.openAndYieldController({viewModel: Login, model: auth}).then(controller => {
    // Note you get here when the dialog is opened, and you are able to close dialog  
    // Promise for the result is stored in controller.result property

   controller.result.then((response) => {

      if (!response.wasCancelled) {
        console.log('good');
      } else {
        console.log('bad');
      }

      console.log(response);

    })

  });
  

Спасибо

Комментарии:

1. используйте openAndYieldController() ( github.com/aurelia /… )

2. Я должен был упомянуть, что я пытался использовать openAndYieldController. Я отредактировал вопрос.

3. Какое представление вы загружаете внутри своего диалога? Вы должны иметь возможность управлять этим через viewmodel внутри вашего диалогового окна.

4. Я не видел ваше представление, но я думаю, что вы, вероятно, используете элемент нижнего колонтитула ai-dialog, верно? Если это так, то этот элемент имеет предопределенное поведение. Вы можете отказаться от его использования и реализовать это поведение самостоятельно. Если это то, что вы делаете, я опубликую подробный ответ для этого сценария.

5. Спасибо, я использую ai-dialog-footer. Я обновил свой вопрос, чтобы показать код.

Ответ №1:

Да, это возможно — и довольно просто, на самом деле. Решение здесь заключается в том, чтобы не использовать controller.ok() or controller.cancel() до тех пор, пока (или если только) вы не захотите закрыть диалоговое окно.

В вашем случае я не совсем уверен, почему вы вызываете controller.ok() со своей кнопки, но вы могли бы сделать что-то вроде этого:

 <ai-dialog-footer>
  <button click.trigger="tryLogin(auth)">Ok</button>
</ai-dialog-footer>
  

… и в вашей ViewModel:

 import {DialogController} from 'aurelia-dialog';

export class Login {
  static inject = [DialogController];
  auth = { username: '', password: '', error: '' };

  constructor(private controller : DialogController){

    this.controller = controller;
  }

  activate(auth){
    this.auth = auth;
  }

  tryLogin (auth) {
    myLoginService.login(auth)
      .then((success) => {
        if (success) this.controller.ok(auth);
      });
  }
}
  

Я надеюсь, что это имеет смысл. По сути, представление в вашем модальном режиме — это просто еще одна пара Aurelia view и viewmodel — оно ничем не отличается от любого другого представления в вашем приложении. Методы controller.ok() и .cancel() предназначены для закрытия диалога и возврата управления вызывающей стороне. Однако, пока вы находитесь внутри диалогового окна, вы можете делать все, что могли бы делать в другом месте приложения.

Комментарии:

1. Отлично! Это имеет смысл после просмотра. Спасибо