Nano Hash - криптовалюты, майнинг, программирование

Auto Fill Angular Material Выберите параметры из URL-адреса

Предположим, у нас есть компонент mat-select

<mat-form-field>
    <mat-select placeholder="Hobby" name="hobby">
        <mat-option *ngFor="let hobby of hobbies" [value]="hobby.value">
            {{hobby.viewValue}}
        </mat-option>
    </mat-select>
</mat-form-field>

Поэтому для каждого выбранного компонента нам нужно получить параметры выбора и сохранить их. Сначала это может показаться простым, но что, если у нас есть 20 таких выбранных компонентов. это займет много времени и будет сложно поддерживать, что не является хорошим подходом в гибкой разработке. Теперь мы хотим заполнить параметры из URL-адреса, как показано ниже:

<mat-form-field>
    <mat-select placeholder="Hobby" name="hobby" srv_url=api/getHobbyOptions" ngModel>
    </mat-select>
</mat-form-field>

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

<mat-form-field>
    <mat-select placeholder="Hobby" name="hobby" srv_url=api/getHobbyOptions" ngModel>
       <fill-options><fill-option>
    </mat-select>
</mat-form-field>

и <fill-options></fill-options> компонент:

<mat-option *ngFor="let hobby of hobbies" [value]="hobby.value">
  {{hobby.viewValue}}
</mat-option>

Конечная цель: получить srv_url от родителя и загрузить данные.
В настоящее время: просто перебрать поддельные данные об увлечениях, но даже в этом случае параметры не отображаются в мат-выборе.
Любая другая идея? заранее спасибо


Ответы:


1

MatSelect не знает, что означает srv_url (и я тоже). Это директива, которую вы написали? Или вы просто пытаетесь определить URL-адрес как свойство, которое использует mat-select? В любом случае вы не показали, что вы делаете с URL-адресом, то есть как вы получаете данные и что вы с ними делаете.

Самый простой подход к этой проблеме — заменить hobbies функцией, которая принимает URL-адрес в качестве параметра. Функция может быть частью службы, как предполагает другой ответ, что делает ее широко используемой повторно. Если вы извлекаете данные через запрос, вы, вероятно, захотите использовать асинхронный канал, и ваша функция будет возвращать Observable или обещание. Например:

<mat-form-field>
    <mat-select placeholder="Hobby" name="hobby">
        <mat-option *ngFor="let hobby of hobbiesService.getHobbies('api/getHobbyOptions') | async" [value]="hobby.value">
            {{hobby.viewValue}}
        </mat-option>
    </mat-select>
</mat-form-field>

Код услуги:

@Injectable()
export class HobbiesService {
  getHobbies(url): Observable<any[]> {
    if (url) {
      return ... // fetch data from url and return Observable;
    }
  }
}

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

constructor(public hobbiesService: HobbiesService) {}
10.08.2018
  • Большое спасибо. Это красивое и креативное решение. Но проблема в том, как сбросить параметры? Например, если выбран родительский элемент (страна), то параметры дочернего элемента должны быть удалены (города). 11.08.2018
  • Это звучит как простой вопрос использования родительского выбора для определения URL-адреса дочерних опций. Таким образом, вместо жестко заданного URL-адреса URL-адрес представляет собой переменную, которая устанавливается родителем. Очень распространенный узор. 13.08.2018
  • У меня нет времени, но если вы создадите рабочий пример stackblitz с родительским компонентом, содержащим дочерний элемент select, я смогу его изменить. 13.08.2018

  • 2

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

    Вы бы написали какой-то компонент, например

    @Component({
      selector: 'my-mat-select-wrapper',
      templateUrl: './my-mat-select-wrapper.html',
    })
    export class MyMatSelectWrapper {
      @Input() srvUrl: string;
      @Input() placeholder: string;
      @Input() name: string;
      options$: Observable<{value: any, viewValue: string}[]>
    
      constructor(private myApiService: MyApiService) { }
    
      ngOnInit() {
        this.options$ = this.myApiService.get(this.srvUrl);
      }
    
    
    }
    
    
    <mat-form-field>
        <mat-select [placeholder]="placeholder" [name]="name">
            <mat-option *ngFor="let opt of options$ | async" [value]="opt.value">
                {{opt.viewValue}}
            </mat-option>
        </mat-select>
    </mat-form-field>
    

    Тогда использование еще проще:

    <my-mat-select-wrapper placeholder="Hobby" name="hobby" srvUrl="api/getHobbyOptions"></my-mat-select-wrapper>
    

    Теперь важно, как получить значение? Вы можете реализовать средство доступа к контрольному значению в оболочке, но гораздо более простой вариант — использовать реактивные формы и передавать элемент управления формы, который вы хотите использовать в качестве ввода, например:

    @Component({
      selector: 'my-mat-select-wrapper',
      templateUrl: './my-mat-select-wrapper.html',
    })
    export class MyMatSelectWrapper {
      @Input() fc: FormControl
      @Input() srvUrl: string;
      @Input() placeholder: string;
      @Input() name: string;
      options$: Observable<{value: any, viewValue: string}[]>
    
      constructor(private myApiService: MyApiService) { }
    
      ngOnInit() {
        this.options$ = this.myApiService.get(this.srvUrl);
      }
    
    
    }
    
    
    <mat-form-field>
        <mat-select [placeholder]="placeholder" [name]="name" [formControl]="fc">
            <mat-option *ngFor="let opt of options$ | async" [value]="opt.value">
                {{opt.viewValue}}
            </mat-option>
        </mat-select>
    </mat-form-field>
    
    
    <my-mat-select-wrapper [fc]="myFormControl" placeholder="Hobby" name="hobby" srvUrl="api/getHobbyOptions"></my-mat-select-wrapper>
    
    10.08.2018
  • Спасибо, Брайан. Я хотел решить проблему, используя это решение, но не пытался из-за обработки управления формой. Не могли бы вы рассказать о решении, использующем подход, основанный на шаблонах? заранее спасибо. 11.08.2018
  • извините, я почти исключительно использую формы, управляемые моделями, поэтому я не уверен, как бы вы сделали это с формами, управляемыми шаблонами. Возможно, вы сможете использовать двустороннюю привязку, аналогичную передаче свойства, аналогично тому, как я передал элемент управления формой. 11.08.2018

  • 3

    Вы можете создать service для получения данных и загрузить их в переменную в .ts и bind в эту переменную в HTML.

    Справочный компонент HTML

    <mat-form-field>
        <mat-select placeholder="Hobby" name="hobby" [(ngModel)]="selectedValue">
            <mat-option *ngFor="let hobby of hobbies" [value]="hobby.value">
                {{hobby.viewValue}}
            </mat-option>
        </mat-select>
    </mat-form-field>
    
      <p> Selected value: {{selectedValue}} </p>
    

    Скрипт компонента

    @Component({
      selector: 'select-form-example',
      templateUrl: './select-form-example.html',
    })
    export class SelectFormExample {
      hobbies = [
        {value: 'cricket-0', viewValue: 'Cricket '},
        {value: 'football-1', viewValue: 'Football'},
        {value: 'books-2', viewValue: 'Books'}
      ];
    
    
       // setting this is the key to initial select.
       selectedValue: string = this.hobbies[0].value;
    }
    
    10.08.2018
  • Но это традиционный подход, который мы используем каждый день. Я не хочу каждый раз вручную извлекать данные. Просто вставьте URL и все. 10.08.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..