【问题标题】:Return formbuilder array from an Observable从 Observable 返回 formbuilder 数组
【发布时间】:2018-09-17 15:32:52
【问题描述】:

我需要为数组类型的控件返回一个 FormControl 数组。 但我需要知道有多少值进入我的 Observable 才能挂载这些数据。

代码如下:

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>

【问题讨论】:

    标签: angular forms typescript observable


    【解决方案1】:

    首先,您不会返回 Observable。您没有返回任何内容(您没有在函数中添加任何 return 语句)。

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

    如果你想从你的 observable 创建一个表单数组,方法如下:

    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 嗯,这是你应该精确的东西......你可以使用 myForm.addControl() 向你的表单添加控件,或者如果它们不依赖于 observables,你可以简单地将它们添加到你的构建器调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2017-12-28
    • 1970-01-01
    • 2019-10-11
    相关资源
    最近更新 更多