угловая подписка внутри кнопки подписки - PullRequest
1 голос
/ 18 марта 2019

В настоящее время у меня есть кнопка, при нажатии которой я хочу вызвать службу:

  saveAssignment(formValues) {
if (this.rulesService.validate(3, 1)) {
    // continue to save
    console.log('trigger save');
    this.assignmentService.saveAssignment(formValues).subscribe((data) => {
    console.log('saved!');
  });
} else {
  alert('came in here instead');
    }
  }

служба правил:

validate(actionId: number, referenceId: number): boolean {
let hasErrors = false;
let result: any;
this.validateRulesAPI(3, 1).subscribe((data) => {
  // some logic here will set hasErrors property to true/false
});
    return hasErrors;
  }

служба правила Я хочу, чтобы она возвращала логическое значение, будь топроверил параметры или нет, таким образом я могу использовать это снова, проблема в том, что порядок выключен, поскольку код возвращается до завершения вызова, это еще один способ организовать это, чтобы они ждали друг друга?так rulesService.validate будет ждать возврата bool, а затем продолжит вызывать saveAssignments, если он вернул true?в противном случае я вижу предупреждение («пришел сюда вместо»), а затем запускается проверочный код.

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

Вы можете использовать switchMap конвейерный оператор rxjs для подписки внутренней наблюдаемой.

Для проверки вы можете вернуть Observable, который сопоставлен с boolean соответственно:

validate(actionId: number, referenceId: number): Observable<boolean> {
    return this.validateRulesAPI(actionId, referenceId).pipe(map(data) => {
         // Do the stuff and check for errors
         // if has error then  ------------>  return false
         // if does not have error then --->  return true
    });
  }

Тогда в методе saveAssignment вы можете использовать switchMap

saveAssignment(formValues) {
    this.rulesService.validate(3, 1).pipe(
      switchMap((isValid) => {
           if(isValid){
                  return this.assignmentService.saveAssignment(formValues)
           }else{
                  return of(false);  // false or whatever the value you want to have
           }
      })
    ).subscribe((response) => {
        if(response === false){
            alert('Invalid'); // alert('came in here instead');
        }else{
            console.log(response);  // response of this.assignmentService.saveAssignment(formValues)  
        }
    })

Надеюсь, это поможет.

0 голосов
/ 18 марта 2019

Вы делаете асинхронную проверку. Это немного отличается от синхронного.

Существует объяснение того, как бороться с такого рода проверкой в ​​ Учебное пособие по проверке угловой формы , которое позволит вам разрешить Angular обрабатывать подписки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...