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 可观察作为指令的输入_Angular_Rxjs_Angular Directive - Fatal编程技术网

Angular 可观察作为指令的输入

Angular 可观察作为指令的输入,angular,rxjs,angular-directive,Angular,Rxjs,Angular Directive,我有一个指令,我想通过这个指令添加@Input observable来处理http observable的成功和失败场景 Directive({ selector: '[search]' }) export class SearchDirective implements OnInit, OnChanges, OnDestroy { @Input() searchObs = new Subject(); ngOnInit() { this.sub =

我有一个指令,我想通过这个指令添加@Input observable来处理http observable的成功和失败场景

Directive({
        selector: '[search]'
    })

    export class SearchDirective implements OnInit, OnChanges, OnDestroy {
    @Input() searchObs = new Subject();

ngOnInit() {
this.sub = this.searchObs.subscribe(
    data => console.log(data),
    err => console.log(err._body),
    () => console.log('directive completed')
);
}

ngOnDestroy() {
this.sub.unsubscribe();
}

ngOnChanges(changes: SimpleChanges): void {
    // tslint:disable-next-line:forin
    for (let propName in changes) {
        let change = changes[propName];
        if (propName === 'searchObs') {
            this.searchObs = (change.currentValue as Subject<any>);
                this.sub = this.searchObs.subscribe(
                    data => console.log(data),
                    err => console.log(err._body),
                    () => console.log('directive change  completed')
                );
        }
      }
  }
}
现在我得到了subscription的第一个值,不管它是指令中的成功还是错误,然后没有数据绑定到指令,会发生什么

主要的问题是主题错误处理关闭Subject.error上的主题,因此我在错误后再次刷新它

组件技术

this.apiservice.getData(args).subscribe((data) => {
      this.searchObs.next(data);
    }, err => {
      this.searchObs.error(err);
       this.searchObs = new Subject();
    });
  }

在您的指令中,@Input searchObs=新主题;这部分将替换组件的输入,只需将@input定义为subject@JimmyHo我尝试了它,得到了以下错误类型错误:无法读取未定义的属性'subscribe',当我将其作为新主题时,我只运行了一次以前的行为,我注意到如果成功,我可以在指令中获取新数据。它仅在错误处理场景中失败。当使用新的Subject@JimmyHo我发现当主题出现错误时,它关闭了,无法恢复或调用subject.next或subject.error。因此,在我的api可观察服务中,我重新定义了主题,所有值现在都绑定到我的指令
this.apiservice.getData(args).subscribe((data) => {
      this.searchObs.next(data);
    }, err => {
      this.searchObs.error(err);
       this.searchObs = new Subject();
    });
  }