Отключить ссылку в angular 2+

Я пытаюсь отключить ссылку до тех пор, пока в Angular 6 не будет выполнен вызов API. Я хочу, чтобы ссылка была отключена до тех пор, пока не будет возвращен API getSelectedDealer ().

 <menu-link *ngIf = "perms.has(perms.TOP_OFFERS) && _dealerPersistenceService.getSelectedDealer()"
           route = "/dynamic-journeys/{{getDealerId()}}/vehicles">
    <menu-item><img src = "/assets/menu-icons/top-offers.svg">Dynamic Journeys</menu-item>
</menu-link>

Вот код для компонента тега «a» и CSS.

<a [routerLink] = "route" routerLinkActive = "active" class = "menu-link" [class.disabled] = "disabled ? true: null">
<ng-content select = "menu-item"></ng-content>

a.disabled {
    pointer-events: none;
    cursor: default;
}

В основном мне нужно, чтобы элементы «ссылка на меню» были отключены перед вызовом API и были включены после.

<a [routerLink] = "route" routerLinkActive = "active" class = "menu-link" [disabled] = "apiReturned ? true : false " >. С apiReturned в качестве свойства компонента ??
Ashish Ranjan 20.07.2018 17:03

Просто установите флаг disabled на true по умолчанию. И сбросьте его до желаемого значения после возврата вызова API.

Shardul 20.07.2018 17:05

По умолчанию свойство Disabled не существует в теге a. Должен ли я установить флаг переключения для отключенного в базовом теге 'a' или в ссылке меню?

LDB 20.07.2018 17:19

@LDB: Извините, я не понял, что это привязка, хотя я добавил ответ, почему ваш подход не работает ??

Ashish Ranjan 20.07.2018 17:41

В основном я просто пытаюсь отключить ссылку, пока не будет возвращен _dealerPersistenceService.getSelectedDealer (). Этот метод находится в компоненте ссылки меню, а не в базовом теге 'a'. Могу ли я проверить, что этот метод был вызван и возвращен в базовом теге «a», или я могу поместить его в ссылку меню?

LDB 20.07.2018 18:48

@LDB: Компонент, в котором находится ваш тег anchor, скажем, компонент anchorTag, это компонент anchorTag, дочерний компонент компонента menu-link?

Ashish Ranjan 20.07.2018 19:38

Как вы можете видеть, тег «a» имеет класс «menu-link», который используется как тег «a». «Ссылка на меню» скрыта, если не был возвращен метод «_dealerPersistenceService.getSelectedDealer ()». Вместо того, чтобы скрывать «ссылку на меню» до тех пор, пока не будет возвращен API ... Я просто хочу, чтобы была показана «ссылка на меню», однако ее необходимо отключить.

LDB 20.07.2018 19:42

Увидим это через некоторое время ..

Ashish Ranjan 20.07.2018 19:51

@LDB: Извините за поздний ответ, вы можете увидеть мой отредактированный ответ ..

Ashish Ranjan 20.07.2018 22:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
9
9
33 050
3

Ответы 3

Если вы хотите использовать что бы то ни было, вы можете добиться этого, просто добавив событие щелчка к этой ссылке с чем-то вроде этого:

<a [routerLink] = "route"
   routerLinkActive = "active"
   class = "menu-link"
   [class.disabled] = "disabled ? true: null"
   (click) = "check($event)">

В ТС:

isReady = false;
check = (event) => {
 if (!this.isReady) {
   event.preventDefault();
 }
}

Итак, isReady - это логическая переменная вашего компонента, и она ложна, пока вы не захотите. Когда вы когда-либо щелкаете по этой ссылке, она проверяет, истинна ли она, но если она ложна, это предотвратит исходное поведение события, и ничего не сработает.

В вашем компоненте есть флаг, который сообщает, вернул ли API ..:

apiReturned = false;

ngOnInit() {

   setTimeout(() => {
      // simulating API call, sets to true after 5 seconds
      this.apiReturned = true;
   }, 5000);
}

И пусть ваш HTML выглядит так:

 <a [class.disabled] = "apiReturned ? null: true"  [href] = "apiReturned ? 'https://stackoverflow.com/users/9442497/ldb' : null" >Click Me!</a>

Здесь я также удалил href из anchor, когда он должен быть отключен.

РЕДАКТИРОВАТЬ

Если ваш тег привязки находится в другом компоненте, у вас есть два способа выполнить задачу.

  1. Отправьте маршрут и статус API компоненту mat-link и действуйте соответствующим образом.
  2. Имейте службу, которая принимает значение статуса API от родительского компонента и использует данные службы в компоненте mat-link. Я бы предпочел использовать службу, потому что вам также придется заблокировать маршрут из строки URL-адреса, когда API не вернулся, с помощью ввода вы можете заблокировать только ссылку, но это не поможет, если кто-то напрямую вводит URL-адрес маршрута в URL-адрес бар. Вы можете использовать Angular Route Guard для предотвращения маршрутизации в таких случаях.

Я объясню использование первого способа, а второй оставлю вам.

В вашем mat-link component.ts есть что-то вроде:

export class MatLinkComponent  {
  @Input() route: string;
  @Input() apiReturned: boolean;
}

И в вашем mat-link.component.html есть что-то вроде:

<a *ngIf = "!apiReturned" href = "#" [class.disabled] = "!apiReturned" >Click Me!</a>

<a *ngIf = "apiReturned" [routerLink] = "route" routerLinkActive = "active" >Click Me!</a>

Вы могли заметить, что я создал два условных тега anchor, потому что routerlink не принимает null, и у нас еще нет чего-то вроде условного routerLink.

В родительском компоненте, скажем, app.component.html или там, где вы используете mat-link.component, укажите что-то вроде:

<mat-link 
      [apiReturned]=apiReturned
      [route] = "'routinghere'">
</mat-link>

Вы можете увидеть рабочий пример здесь: Пример. Ссылка Click Me! активируется через 10 секунд.

Спасибо за ответ. Хорошо, я пробовал это. Сейчас все ссылки отключены, как если бы apiReturned = false. Вызываемый api - это _dealerPersistenceService.getSelectedDealer () ... Как вы можете видеть в моем коде выше, ссылка на меню скрыта до тех пор, пока не будет сделан этот вызов. Как мне переключиться на тег apiReturned = true 'a' после выполнения вызова?

LDB 20.07.2018 23:31

Где бы вы ни выполняли вызов API, скажем, здесь вы будете делать это в компоненте App. Итак, если ваша служба возвращает Observable, вы можете сделать что-то вроде: _dealerPersistenceService.getSelectedDealer().subscribe((suc‌​cess)=>{// check success and then this.apiReturned = true })

Ashish Ranjan 20.07.2018 23:36

Вызов API не является наблюдаемым

LDB 21.07.2018 00:21

@LDB: тогда? Это обещание? Или вы подписываетесь в самой услуге?

Ashish Ranjan 21.07.2018 00:22

Этот метод вызывается в файле .ts для компонента ссылки на меню. Метод выглядит так: getDealerId () {return this._dealerPersistenceService.getSelectedDealer (). Id; }. Могу я не просто переключить здесь свойство apiReturned? Не похоже, что я могу указать, что свойство существует в теге дочернего компонента 'a'

LDB 21.07.2018 00:29

@LDB: Итак, когда вы вызываете этот метод? Установите для флага apiReturned значение true везде, где вы вызываете getDealerId()

Ashish Ranjan 21.07.2018 00:33

Это то, что я пробовал .. Однако как мне получить доступ к логическому API в компоненте, в котором вызывается метод ?? Свойство (apiReturned) создается в «matlinkComponent» (который является дочерним компонентом). Мне нужно переключить это логическое значение в родительском компоненте, который вызывает метод ...

LDB 21.07.2018 00:43

@LDB: apiReturned является свойством как родительского, так и дочернего. С самого начала. Это свойство родителя, которое затем отправляется как входное свойство дочернему элементу, то есть mat-link. Разве вы не открывали ссылку, которую я добавил в ответ как «Пример»? Вы увидите, что я переключаю флаг в самом родителе.

Ashish Ranjan 21.07.2018 02:59

Angular нужен способ выборочного применения директив, но вот мое решение:

<a
    (click) = "markAsRead(notification);notification.externalUrl || $event.preventDefault()"
    [href] = "notification.externalUrl"
    target = "_blank""
...>

Другие вопросы по теме