angular - 离子可选,但在表单内进行多项选择时出错
问题描述
这就是我想要实现的目标:我正在制作一个简单的 Ionic Selectable 组件,让用户能够选择一个值并提交它。提交时,值应保存在 Firebase 数据库中的唯一 ID(生成的日期和时间戳)下。我已经使用文本值使其工作,但是,在使用 Ionic selectable 时出现以下错误:
未捕获(承诺中):TypeError: CreateListFromArrayLike 在 e.set [as value] 的非对象上调用
这涉及到很多代码,包括 Firebase 代码,但由于这似乎有效,我只是发布了我的相关代码。如果需要任何其他信息来解决此错误,请告诉我。
如果我没有在表单中添加 [isMultiple] 选项,它实际上可以工作,但是,当我添加它时,我得到了那个错误。
这是我的 home.html 文件:
<ion-header>
<ion-navbar>
<ion-title>Ionic Selectable</ion-title>
</ion-navbar>
</ion-header>
<ion-content>
<form [formGroup]="form" margin-bottom>
<ion-item>
<ion-label>Diagnosis</ion-label>
<ionic-selectable
item-content
formControlName="diagnosis"
[items]="diagnoses"
[isMultiple]="true"
[canSearch]="true"
(onChange)="diagnosisChange($event)">
</ionic-selectable>
</ion-item>
<div margin-top padding>
<button margin-top round ion-button block [disabled]="!form.valid">Submit</button>
</div>
</form>
</ion-content>
我的 home.ts 文件:
import { Component } from '@angular/core';
import { IonicSelectableComponent } from 'ionic-selectable';
import { IonicPage, NavController, ViewController, NavParams } from 'ionic-angular';
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
import { DiagnosisService } from '../../services';
import { Diagnosis } from '../../types';
@Component({
selector: 'page-home',
templateUrl: 'home.html'
})
export class HomePage {
diagnoses: Diagnosis[];
diagnosisControl: FormControl;
form: FormGroup;
constructor(
private view: ViewController,
private diagnosisService: DiagnosisService,
private formBuilder: FormBuilder
) {
this.diagnoses = this.diagnosisService.getDiagnoses();
this.diagnosisControl = this.formBuilder.control(this.diagnoses[0],
Validators.required);
this.form = this.formBuilder.group({
diagnosis: this.diagnosisControl
});
}
diagnosisChange(event: {
component: IonicSelectableComponent,
value: any
}) {
console.log('diagnosis:', event.value);
}
submit() {
this.close();
}
close() {
this.view.dismiss();
}
}
我的 diagnostic.service.ts 文件如下:
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { delay } from 'rxjs/operators';
import { Diagnosis } from '../types';
@Injectable()
export class DiagnosisService {
private diagnoses: Diagnosis[] =
['Hypothyroidism', 'Hyperthyroidism', 'Diabetes Type 1', 'Diabetes Type 2'];
getDiagnoses(page?: number, size?: number): Diagnosis[] {
let diagnoses = [];
this.diagnoses.forEach(diagnosis => {
diagnoses.push(diagnosis);
});
if (page && size) {
diagnoses = diagnoses.slice((page - 1) * size, ((page - 1) * size) + size);
}
return diagnoses;
}
getDiagnosesAsync(page?: number, size?: number, timeout = 2000): Observable<Diagnosis[]> {
return new Observable<Diagnosis[]>(observer => {
observer.next(this.getDiagnoses(page, size));
observer.complete();
}).pipe(delay(timeout));
}
}
我已经设法创建了一个堆栈闪电战,它也重现了我的问题。您可以看到,只要我删除[isMultiple]="true"
,它就可以工作。对此的任何帮助将不胜感激。
解决方案
所以我一直在使用这个插件,它工作得很好,文档中有很多关于问题的信息。我在您的堆栈闪电战代码中注意到的一件事是在您的 Types 目录中带有 diagnostic.ts 您没有分配给您的数组的元素名称。这样做的好处是明确地包含您的值,即使它是一个值。您可以使用值的 ID 和值的名称。例如:
export class Diagnosis {
public id: number;
public name: string;
}
另外,我注意到在您的 html 和 ts 文件中,您似乎正在使用异步搜索或虚拟滚动,但您的diagnosisChange()
函数中缺少一些代码,以便根据文档使用您的服务过滤数据。我会确保您遵循示例。我建议的一件事是在存储到 Firebase 之前确保您的 ionic selectable 上的功能正常工作。当然,可选元素将作为键值对存储到您的表单中,因此请确保在提交表单时正确输入。
推荐阅读
- tensorflow - 关于使用 tf.image.crop_and_resize
- javascript - 如何在 innerHTML 语句中使用变量来显示特定的对象值
- django - 在 Django Admin 中显示外键相关表
- python - 用各自的平均值填充空值
- javascript - 当我尝试遍历项目时,从 LocalStorage 获取项目会出错
- javascript - Javascript 中的 MediaSource 与 MediaStream
- python - 使用 COM 和 Python 通过 DirectShow 访问网络摄像头
- mmap - 如何获得 flatbuffers 二进制文件中字段的偏移量?
- java - Shutdownhook - 日志未在控制台/文件 @Predestroy 方法中打印
- r - 基于R中的多个参数的数据帧中的行号