typescript subscribe refresh onsubmit 方法

typescript subscribe refresh onsubmit metod

产品-generic.service.ts

constructor(
    private genericParaBirimi: GenericService<ParaBirimi, 0>,
) {
    //#region List
    this.genericParaBirimi?.Get_All("ParaBirimis/Generic_Method").subscribe((x: any) => this.paraBirims = x);     
}

首价-list.component.ts

constructor( 
public productservice : ProductService) { }
this.genericParaBirimi?.Post(this.ParaBirimForm.value, "ParaBirimis/Generic_Method").subscribe({
  next: (data) => { },
  error: (err) => { },
  complete: () => {
    
    Refresh parabirims in html
  }
});

首价-list.component.html

 <p-autoComplete formControlName="ParaBirimiID" [suggestions]="filteredParaBirimi"
                    (completeMethod)="filterParaBirims($event)" field="paraBirim" [dropdown]="true">
                    <div *ngFor="let item of productservice.paraBirims" class="country-item">
                        <div>{{item.paraBirim}}</div>
                    </div>
                </p-autoComplete>

如何使用添加到parabirims列表后自动更新页面而不刷新页面的方法?

我们需要做的第一件事是保持 paraBirimi 状态包含在服务中。按照设计,您不应从任何组件调用 API 请求。

下一步是将您的 GET 和 POST 更新打包到组件可以订阅的单个可观察对象中。让我们进入代码。

服务文件

public paraBirimis$: Observable<ParaBirimi[]>;
private addParaBirimi = new Subject<ParaBirimi>();

constructor(private http:HttpClient){
  this.paraBirimis$ = this.http
  .get<ParaBirimi[]>(`${environment.url}/ParaBirimis/Generic_Method`)
  .pipe(
    switchMap(api => this.paraBirimiUpdate.pipe(
      scan((list, new)=>[...list, new], api),
      startWith(api)
    )),
  );
}

public postParaBirimi(payload) {
  this.http
  .post<ParaBirimi[]>(`${environment.url}/ParaBirimis/Generic_Method`, payload)
  .pipe(
    tap(newParaBirimi=>this.addParaBirimi.next(newParaBirimi))
  ).subscribe();
}

我们的 public observable paraBirimis$ 首先从 GET 端点获取数据。然后我们将 switchMap 切换到一个 Subject 中,它将发出从我们的 POST 请求中创建的任何新的 paraBirimi。 scan() 运算符类似于 .reduce(),但用于从 observables 发出的值。 https://www.learnrxjs.io/learn-rxjs/operators/transformation/scan 简而言之,我们正在获取从 Subject 发出的值,并通过展开运算符将它们添加到我们的状态数组中。

因为 Subjects 不发出任何开始的东西,我们包含 startWith() 运算符让它发出我们的 GET API 请求作为第一个值。

接下来,我们需要我们的 Subject 在 POST 请求后发出新值。我们创建一个 public 方法来触发我们的 POST 请求,然后使用 .next() 因此 Subject 将发出新值,触发 switchMap() 在我们的 public 可观察到。

通过我们服务中的反应式管道设置,我们的组件可以非常简单,因为我们的可观察对象将自动更新任何状态变化。我们唯一需要包括的新东西是在我们的服务中调用 postParaBirimi() 的方法。

组件 TS

this.paraBirims$ = this.productservice.paraBirims$;

public postParaBirimi(){
  this.productservice.postParaBirimi(this.ParaBirimForm.value);
}

组件HTML

<p-autoComplete
  formControlName="ParaBirimiID"
  [suggestions]="filteredParaBirimi"
  (completeMethod)="filterParaBirims($event)"
  field="paraBirim"
  [dropdown]="true"
>
  <div *ngFor="let item of paraBirims$ | async" class="country-item">
    <div>{{item.paraBirim}}</div>
  </div>
</p-autoComplete>

就是这样。您的组件对我们在服务中创建的可观察对象有一个有效订阅。在我们的服务中调用 POST 事件将导致同一个可观察对象发出一个包含新创建值的新列表。