如何在Angular 2中创建下拉组件?

Rya*_*yan 19 angular

我想使用Angular 2创建一个下拉菜单,但我不知道如何在"Angular 2 way"中创建它.

我可以创建一个像这样使用的下拉组件:

<dropdown>
    <li (click)="action('item 1')">Item 1</li>
    <li (click)="action('item 2')">Item 2</li>
</dropdown>
Run Code Online (Sandbox Code Playgroud)

这似乎很好,但是然后action需要在包含该组件的组件上定义该方法,<dropdown>并且<li>元素不会从<dropdown>组件中的样式中应用样式,这有点奇怪.

另一种选择是创建像这样使用的组件:

<dropdown>
    <dropdown-item (click)="action('item 1')">Item 1</dropdown-item>
    <dropdown-item (click)="action('item 2')">Item 2</dropdown-item>
<dropdown>
Run Code Online (Sandbox Code Playgroud)

这更详细,dropdown-item组件处理单击操作,项目的样式也由dropdown-item组件定义.

在Angular 2中有更典型的方法吗?

编辑:我不是在谈论表单的自定义选择输入.更像是带有选项的菜单或右键单击上下文菜单.

Thi*_*ier 52

我会说这取决于你想做什么.

如果您的下拉列表是管理状态的表单的组件,我将利用Angular2的双向绑定.为此,我将使用两个属性:一个用于获取关联对象的输入,另一个用于在状态更改时通知的输出.

这是一个示例:

export class DropdownValue {
  value:string;
  label:string;

  constructor(value:string,label:string) {
    this.value = value;
    this.label = label;
  }
}

@Component({
  selector: 'dropdown',
  template: `
    <ul>
      <li *ngFor="let value of values" (click)="select(value.value)">{{value.label}}</li>
    </ul>
  `
})
export class DropdownComponent {
  @Input()
  values: DropdownValue[];

  @Input()
  value: string[];

  @Output()
  valueChange: EventEmitter;

  constructor(private elementRef:ElementRef) {
    this.valueChange = new EventEmitter();
  }

  select(value) {
    this.valueChange.emit(value);
  }
}
Run Code Online (Sandbox Code Playgroud)

这允许您以这种方式使用它:

<dropdown [values]="dropdownValues" [(value)]="value"></dropdown>
Run Code Online (Sandbox Code Playgroud)

您可以在组件中构建下拉列表,应用样式并在内部管理选择.

编辑

您可以注意到,您可以简单地利用组件中的自定义事件来触发选择下拉列表.所以该组件现在将是这样的:

export class DropdownValue {
  value:string;
  label:string;

  constructor(value:string,label:string) {
    this.value = value;
    this.label = label;
  }
}

@Component({
  selector: 'dropdown',
  template: `
    <ul>
      <li *ngFor="let value of values" (click)="selectItem(value.value)">{{value.label}}</li>
    </ul>
  `
})
export class DropdownComponent {
  @Input()
  values: DropdownValue[];

  @Output()
  select: EventEmitter;

  constructor() {
    this.select = new EventEmitter();
  }

  selectItem(value) {
    this.select.emit(value);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用这样的组件:

<dropdown [values]="dropdownValues" (select)="action($event.value)"></dropdown>
Run Code Online (Sandbox Code Playgroud)

请注意,该action方法是父组件之一(而不是下拉组件).

  • "#value of values"是*ngFor表达式的弃用语法.使用"让值的价值". (2认同)