angular - 使用 Angular 使用以前的地址自动完成表单
问题描述
我对 Angular 不是很熟悉,但在这种情况下我必须使用它。有一项服务将以前使用的地址(字符串)列表作为Observable<{name: string; value: string}>
. 对该服务的调用是this.jobAddressesService.getAddresses();
并且它按预期工作得很好。这不是我有权修改的东西,所以我不理会它。
这是我的 HTML 表单。我正在尝试在用户键入时过滤下拉选项。
<mat-form-field class="w-100 mt-25" [class.input-disabled]="form.get('JobAddressID')?.disabled">
<input type="text" matInput placeholder="*Select previously used address" formControlName="JobAddressID" [matAutocomplete]="auto">
<mat-autocomplete #auto="matAutocomplete" class="w-100">
<mat-option *ngFor="let elem of savedLocationsFiltered" [value]="elem.name">
{{elem.name | truncateString: 60}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
这是我的组件,为了便于故障排除,我将其精简为基本要素:
// A bunch of import statements here
@Component({
selector: 'job-location-auth',
templateUrl: './job-location-auth.component.html',
styleUrls: ['./job-location-auth.component.scss', '../../shared/css/tool-tip.scss']
})
export class JobLocationAuthComponent implements OnInit, OnDestroy {
form: FormGroup;
jobAddressID: FormControl;
savedLocations: Observable<{ name: string; value: string }[]>;
savedLocationsFiltered: any[] = [];
private subs = new SubSink();
constructor(
private jobAddressesService: JobAddressesService
) { }
ngOnInit(): void {
this.initialize();
}
ngOnDestroy(): void {
this.subs.unsubscribe();
}
initialize(): void {
this.form = this.locationModel.formGroup;
this.setJobAddressControl();
this.formAddress = this.form.get('JobAddress') as FormGroup;
this.getAddressList();
this.filterAddresses();
}
setJobAddressControl(): void {
// this method is fine
this.jobAddressID = this.form.get('JobAddressID') as FormControl;
this.subs.sink = this.jobAddressID.valueChanges.subscribe((value: number) => {
if (value) {
this.analyticsLoggingService.TrackEvent('JobDetails', 'JobAddress', 'Selected');
}
this.setAddress(+value);
});
}
getAddressList(): void {
this.savedLocations = this.jobAddressesService.getAddresses();
}
filterAddresses() {
const jobAddress = this.form.get('JobAddressID');
if (jobAddress) {
jobAddress.valueChanges
.debounceTime(200)
.subscribe(
res => this.getFilteredAddresses(res.value)
);
}
}
getFilteredAddresses(jobAddress: string): any {
return this.jobAddressesService.getAddresses().pipe(
filter(address => address.name.includes(jobAddress))
).subscribe(
() => console.log('Job Address: ', jobAddress)
);
}
saveAddress(): void {
// functionality for setting address, works fine
}
}
具体来说,我使用 filter() 的尝试似乎没有按预期工作,并且我得到“无法读取未定义的属性'包含'”。
解决方案
更新
尝试将您的代码更改为:
getFilteredAddresses(jobAddress: string): any {
return this.jobAddressesService.getAddresses().pipe(
filter(address => name.includes(jobAddress))
老答案:
您得到的错误是 address.name 是undefined
. 您需要检查为什么您得到的响应返回一个undefined
. 您可以添加tap
以打印对象并查看您从服务中收到的内容:
getFilteredAddresses(jobAddress: string): any {
return this.jobAddressesService.getAddresses().pipe(
tap(address => console.log(address)),
filter(address => address.name.includes(jobAddress))
它应该打印您收到的响应,您可以在其中验证您是否收到正确的响应。如果没有,您应该使用后端响应进行故障排除。
推荐阅读
- java - 按下删除按钮时如何获取相应的名称
- python - 尝试使用 Spinbox 和 RadioButtons 将列表的一部分添加到另一部分
- c# - C# wpf 如何将变量 Excel.Worksheet 从 Button_Click 传递到另一个 Button_Click
- path - 关于图论中路径定义的困惑
- express - 如何不在 expressjs 上监听 3000 端口?
- java - 如何将多部分文件转换为java中的文件
- javascript - 当绘制 2 个甜甜圈时,D3JS 图形甜甜圈未显示一些楔形
- sql-server - 在 SQL Server 中筛选多行
- postgresql - 使用 md5 密码登录 postgresql
- laravel-5 - Laravel 网站“在共享主机上上传”显示的是目录结构,而不是我指定的网络路由