形式:手动触发valueChange

Cal*_*gel 2 observable rxjs angular

我正在使用 FormBuilder 创建表单。当我的一个 FormControl 更新时,我想调用另一个函数,所以我正在使用valueChanges它。但问题是我想在初始化它时触发它。我看到setValue应该可以做这些事情,但我看起来不像为我工作,或者我太糟糕了。

HTML:

<div class="col form-group">
  <label for="stringArray">My label</label>
  <select id="stringArray" class="form-control" *ngIf="stringArray$ | async as stringArray" formControlName="mySelect">
    <option *ngFor="let val of stringArray" [value]="val">{{ val }}</option>
  </select>
</div>
Run Code Online (Sandbox Code Playgroud)

TS

public myForm: FormGroup;
public stringArray$: Observable<string[]> = null;

constructor(private formBuilder: FormBuilder) {}

ngOnInit() {
  this.initForm();

  this.stringArray$ = this.myForm.get('mySelect').valueChanges.pipe(
    switchMap(value => {
      return this.doSomething(value);
    })
  );
  this.myForm.get('mySelect').setValue('tmp', { emitEvent: true });
}

initForm() {
  this.myForm = this.formBuilder.group({
    mySelect: ['', Validator.required]
  })
}

doSomething(value): Observable<string[]> {
  console.log(value);
  return of(['toto', 'tata', 'tutu', 'tmp'])
}
Run Code Online (Sandbox Code Playgroud)

我没有任何错误,只是我的选择没有出现,因为stringArray$null

我希望我的例子足够清楚。感谢您的帮助 !

rea*_*pie 5

rxjs 运算符的绝佳用例startWith!这是我在使用时在代码中有很多的模式valueChange

这是我个人经常做的事情。

import { startWith } from 'rxjs/operators';

this.stringArray$ = this.myForm.get('mySelect')
.valueChanges.pipe(
    startWith(this.myForm.value),
    switchMap(value => {
      return this.doSomething(value);
    })
  );

Run Code Online (Sandbox Code Playgroud)

请参阅我的stackblitz示例

请参阅此处startWith有关操作员的文档