【发布时间】:2019-03-01 01:45:08
【问题描述】:
所以我正在尝试为一个项目构建一个“自动完成”指令,该指令将查询 API 并显示一个可供选择的结果列表。我有一个组件,它显示一个带有简单输入框的模式。我需要能够在框中输入内容以搜索成员,单击成员并将其添加到 组件 中的数组中。
编辑:
我遇到的问题是,当我调用 this.wlAutocomplete.next(value); 时,它会返回到我的组件并使用输入字段中的正确值进行 API 调用,它不会将数据返回到指令以处理响应从那里的 API。
StackBlitz 示例: https://stackblitz.com/edit/angular-11erew
组件将跟踪选定成员的数组。我需要能够:
- 在 Component 中调用我的 API 来获取数据并返回指令
- 指令将需要读取数据并在输入框下方显示一个列表(我可以在这里做 HTML)
- 单击下拉列表中的列表项会将选择返回发送到组件以根据需要进行处理,例如。将其添加到数组中。
我的组件有一个方法:
queryMembers(value: string): Subscription {
return this.memberService.query({ term: value, groupKey: this.group.groupKey })
.subscribe((members) => {
console.log(members);
return this.searchMemberList = members;
});
}
我在模板中使用的是这样的:
<input (wlAutocomplete)="queryMembers($event)" class="uk-search-input" type="search" placeholder="Search...">
这是指令的代码:
@Directive({
selector: 'input[wlAutocomplete]'
})
export class AutocompleteDirective {
modelChanged: Subject<string> = new Subject<string>();
subscription: Subscription;
debounce: number = 500;
constructor() {
this.subscription =
this.modelChanged
.pipe(debounceTime(this.debounce))
.subscribe(value => {
this.wlAutocomplete.next(value); // I need to get the data from component method passed into `wlAutocomplete`
});
}
@Output() wlAutocomplete: EventEmitter<any> = new EventEmitter();
@HostListener('input', ['$event'])
onChange($event) {
this.modelChanged.next($event.target.value);
}
}
【问题讨论】:
-
请编辑您的问题,包括一个特定的问题,任何错误,并在可能的情况下发布一个最小的完整示例,使用类似 stackblitz.com 的东西
-
我的问题是 this.wlAutocomplete.next(value);成功返回到带有字符串的组件方法 (queryMembers) 并查询 API,但我无法让组件将数据 (Member[]) 返回到指令以在那里处理。我没有时间整理一个工作示例,但如果需要,我可以稍后再设置一个。
-
@FussinHussin 这是一个 StackBlitz:stackblitz.com/edit/angular-11erew。我正在努力弄清楚如何将组件中的数据返回到指令中。
-
谢谢你的例子,我会看的。只是提醒一下,您在示例中添加了人们的个人信息
-
所以,我有点困惑。您希望指令中的值在哪里以及用于什么功能?
标签: angular typescript rxjs rxjs6