Angular 表单控件值更改不通知

标签 angular typescript rxjs

我有一个订阅了 valueChanges 可观察对象的基本表单控件。

@Component({
  selector: 'my-app',
  template: `
       <input [formControl]="control" />
       <div>{{ name$ | async | json }}</div>
   `
})
export class AppComponent implements OnInit {
  name$: Observable<string>;
  control;

  constructor(private builder: FormBuilder) {
    this.control = this.builder.control('');
  }

  ngOnInit() {
    this.name$ = this.control.valueChanges
      .pipe(
        map((name) => {
          console.log('fired', name)
          return name;
        })
      );


    this.control.setValue('2');
  }
}

当我调用 setValue 时,观察者没有收到任何通知。似乎异步管道不起作用。如果我将 setValue 包装在 setTimeout 中,它就可以工作。为什么会这样?

我还尝试添加 shareReplay() ,但它也不起作用。

最佳答案

这个问题的解决方案

this.control.setValue('2'); // I move any changes at the top for startWith operater 
this.name$ = this.control.valueChanges
  .pipe(
    startWith(this.control.value),
    map((name) => {
      console.log('fired', name)
      return name;
    })
  );

另一种在没有 async 运算符的情况下使其工作的方法这意味着我已经在控件值更改为“2”之前订阅了值更改,并且我稍后捕获了所有更改

this.control.valueChanges
  .pipe(
    map((name) => {
      console.log('fired', name)
      return name;
    })
  )
  .subscribe ( v => this.value = v )

模板

{{value}}

为什么问题中带有异步的示例不起作用,异步运算符将订阅可观察对象,但在异步订阅时,控件的当前值将为“2”,因此第一个值的原因没有变化不作为表单控件的更改发出,另一个可观察的东西是惰性的,所以当您订阅时,您将获得值,之前的任何更改都不会被看到

关于 Angular 表单控件值更改不通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53144859/

相关文章:

javascript - 强制完成 rxjs 观察者

angular - 使用 ngx-bootstrap modal 将数据传递给 modal

angular - 在 Material MatDialog 中动态加载组件

Angular 6 第二嵌套子路线不起作用

reactjs - 在TypeScript中 react 组件类型

javascript - RESTful API 中的 Typescript 自定义错误

javascript - 合并可观察量 A 和 B : Should only trigger if A has data; take from B if data or default

javascript - Angular 2 : why use switchMap when retrieving route params?

angular 2 routerLink 无法重新访问

typescript - 如何在TS编译错误时使webpack2失败?