Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 从可观察对象返回formbuilder数组_Angular_Forms_Typescript_Observable - Fatal编程技术网

Angular 从可观察对象返回formbuilder数组

Angular 从可观察对象返回formbuilder数组,angular,forms,typescript,observable,Angular,Forms,Typescript,Observable,我需要为数组类型控件返回FormControl数组。 但我需要知道有多少值进入我的可观测范围,才能装载这些数据 代码如下: users$ = this._store.select(usersSelectors.getUsers); createForm(): void { this.myForm = this._formBuilder.group({ users: this.buildArray(), }); } buildArray(): any {

我需要为数组类型控件返回FormControl数组。 但我需要知道有多少值进入我的可观测范围,才能装载这些数据

代码如下:

users$ = this._store.select(usersSelectors.getUsers);

createForm(): void {
    this.myForm = this._formBuilder.group({
        users: this.buildArray(),
    });
}

buildArray(): any {
    this.users$.subscribe((data) => {
        if (data) {
            const values = data.map(() => new FormControl(false));
            return this._formBuilder.array(values);
        }
    });
}
原因是,在HTML中,我可以创建动态复选框,并为用户启用特定操作

component.html

<div class="col-md-3">
  <label for="users">Users</label>
  <div id="users" class="row">
    <div class="checkbox" class="col-sm-4"
      formArrayName="users"
      *ngFor="let item of myForm.get('users').controls; let i = index" >
      <label class="checkbox-inline">
        <input type="checkbox" [formControlName]="i"> {{ users$[i] }}
      </label>
    </div>

使用者
{{users$[i]}

首先,您没有返回一个可观察的。您没有返回任何内容(您没有在函数中添加任何return语句)

另外,如果您添加了一个订阅,您将返回一个订阅,因为您在函数中使用了
subscribe

如果要从可观察对象创建表单数组,请执行以下操作:

users$ = this._store.select(usersSelectors.getUsers);

createForm(): void {
  this.users$
    .pipe(
      filter(data => !!data),
      map(users => this._formBuilder.array(users.map(() => new FormControl(false))))
    )
    .subscribe(usersFormArray => this.myForm = this._formBuilder.group({
      users: usersFormArray
    })
  });
}
您不需要另一个函数,因为这个函数可以实现您想要的一切

首先过滤数据:这相当于一个条件。如果没有任何数据,则不会触发订阅

然后,映射可观察值以返回表单数组


最后,使用映射值订阅并创建表单

好的,我明白,但是HTML呢?如何访问可观察值以在复选框中显示用户名?@Luiz您的HTML不会更改,您只需要附加一个条件(您应该已经具备),例如
*ngIf=“myForm”
,以避免表单未定义时出错(这可能会发生,因为在某些情况下,您的存储不会返回值)好的,但我的表单也有其他字段。。。但是我可以用上面的逻辑创建一个方法来返回formControl数组吗?@Luiz-well这是你应该做的。。。您可以使用
myForm.addControl()
将控件添加到表单中,或者如果它们不依赖于可观察对象,您只需在生成器调用中添加它们即可。