Как обнаружить изменения ngSwitch на угловой странице

#angular #dom #stripe-payments #angular-changedetection #ng-switch

#angular #dom #stripe-платежи #angular-обнаружение изменений #ng-switch

Вопрос:

В настоящее время я интегрирую Stripe в Angular. Реализация работала нормально, пока я не начал перемещать элементы Stripe в ngSwitchCase и ng-container

Именно тогда я начал получать эту ошибку:

 ERROR IntegrationError: The selector you specified (#card-element) applies to no DOM elements 
that are currently on the page.
Make sure the element exists on the page before calling mount()
  

Причина в том, что stripe пытается получить mount элемент до ngSwitchCase того, как он появится. Я пытался использовать ngAfterViewInit , но кажется, что функция выполняется один раз, когда компонент отображается в первый раз, а не при ngSwitch изменении представления.

Есть ли способ, которым я могу обнаружить изменения в представлении компонента? Таким образом, я знаю, когда к mount() элементам Stripe после полного отображения компонента. Обратите внимание ниже, что я использую ng-container which do not добавляет узлы DOM в HTML, согласно документам Angular.

 <ng-container [ngSwitch]="selectedForm">
        <ng-container *ngSwitchCase="'FORM_ONE'">
          <form>
              ...
          </form>
        </ng-container>
        <ng-container *ngSwitchCase="'FORM_TWO'">
          <form>
              ...
          </form>
        </ng-container>
        <ng-container *ngSwitchCase="'FORM_THREE'">
           // Stripe 'card-element'
          <form action="/charge" method="post" id="payment-form">
              <label for="card-element">Credit or debit card</label>
              <div id="card-element"></div>
              <div id="card-errors" role="alert"></div>
          </form>
  </ng-container>
</ng-container>
  

Ответ №1:

в шаблоне добавьте имя в карточку

 <ng-container *ngSwitchCase="'FORM_THREE'">
           // Stripe 'card-element'
          <form action="/charge" method="post" id="payment-form">
              <label for="card-element">Credit or debit card</label>
              <div #stripeCard id="card-element"></div>
              <div id="card-errors" role="alert"></div>
          </form>
  </ng-container>
  

теперь вы можете получать уведомления при визуализации с помощью установщика.
в компоненте:

  card:ElementRef;
 @ViewChild('stripeCard') set content(content: ElementRef) {
    if(content) { // initially setter gets called with undefined
         
        //mount it here...
     
       //for future reference...  
       this.card=content;
    }
 }