Передача событий и URL-адресов с помощью @Input и @Output

#angular #angular2-template

#angular #angular2-шаблон

Вопрос:

Полный новичок в angular2 и не опытный веб-разработчик, поэтому я приношу извинения за любую крайнюю глупость, которая присутствует в этом вопросе…

У меня возникли некоторые проблемы с созданием компонента для выпадающего списка выбора. Моя цель — использовать этот компонент в другом компоненте и иметь метод в родительском компоненте, вызываемый каждый раз при нажатии опции в списке выбора.

Вот шаблон для выпадающего списка-input (дочерний компонент):

     <div>
    <select>
        <option (click)="clicked($event)" *ngFor="let option of options">{{option.label}}</option>
    </select>
    </div>
  

И вот как выглядит класс для этого:

 export class DropdownInput {
// List of options for the dropdown to have
public options: InputOption[];

// Url for controller method to get options
@Input() url = "/api/LogViewer/GetOpts";

@Output() clickEvent = new EventEmitter();

public clicked(event) {
    this.clickEvent.emit(event);
}

// Get list of options on construction
constructor(http: Http) {
    http.get(this.url).subscribe(result => {
        this.options = result.json();
    });
}

interface InputOption {
    value: string;
    label: string;
}
  

Итак, из того, что я понимаю о том, что у меня есть, к каждой опции выпадающего списка привязан метод ‘clicked()’ при нажатии. Этот метод должен передавать событие щелчка методу, который родительский привязывает к ‘ClickEvent’.

Вот как я использую этот компонент в родительском:

 <dropdown-input (clickEvent)="typeClick($event)"></dropdown-input>
  

И родительский компонент имеет этот метод внутри класса:

 public typeClick(event) {
    console.log(event);
}
  

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

Вторая проблема: есть ли хороший способ передать URL-адрес в качестве входных данных в раскрывающийся компонент? Простое указание «[url]=»/api/LogViewer/GetOpts» при использовании выпадающего списка ввода выдает ошибку.

Спасибо!

P.S. Просто чтобы избежать проблемы XY, я делаю все это, потому что хочу создать компонент, который в основном представляет собой панель входных данных (текстовые поля, выпадающие списки, переключатели, календари), которые я могу динамически создавать на множестве разных страниц (для использования поверх таблицы данных для фильтрации и т.д.). Я думаю, это похоже на форму, есть ли решение для этого уже?

Ответ №1:

Вы прослушиваете событие (click) в вашем варианте, но вы должны прослушивать событие change. Вы также передаете фактическое событие своему родительскому компоненту, в то время как хотите передать выбранное значение. Вы можете сделать это следующим образом:

 <select (change)="onChange($event.target.value)">
  

Если вы сделаете это, метод onChange будет вызван с выбранным значением, а не с фактическим событием изменения.