重新加载搜索栏结果

Reloading search bar results

我创建了一个搜索栏来在我的应用程序中搜索用户。搜索栏位于我的导航栏中,当我输入内容并单击搜索按钮时一切正常,我被重定向到我的搜索页面并显示正确的结果。然而,在被重定向到我的搜索页面后,当我尝试在我的搜索栏中输入另一个输入并单击搜索按钮时,虽然 url 发生了变化,但输入正确并且页面自动刷新,结果没有更新。我必须再次手动刷新页面,然后才会显示新结果。这是为什么? 这是导航栏组件中的代码:

 members: Member[];

 constructor(private memberService: MembersService)

 search(content: string) {
    this.memberService.search(content).subscribe((response: Member[]) => {
      this.members = response;
      console.log(response);
      console.log(content);
    })
  }


<form class="example ml-2"  style="margin:auto;max-width:300px">
        <input id="typeahead-format" name="content" [(ngModel)]="model.content" type="text" class="ml-2 
         form-control" placeholder="Search users"/>
        <button class="d-flex align-items-center justify-content-center" (click)="search(model.content)" 
         routerLink="search/{{model.content}}"><em class="fa fa-search"></em></button>
</form>

这是我的搜索栏组件中的代码:

export class SearchbarComponent implements OnInit {

  content: string;
  members: Member[];

  constructor(private memberService: MembersService, private route: ActivatedRoute,
    private appRef: ApplicationRef) {  }

  ngOnInit(): void {
    this.route.params.subscribe((params) => {
      console.log(params);
      this.content = params['content'];
    });

    this.search();
  }

  search() {
    this.memberService.search(this.route.snapshot.paramMap.get('content')).subscribe((response: Member[]) => {
      this.members = response;
      console.log(response);
    })
  }
}
<div *ngFor="let member of members" style="margin-top:3%; margin-left:5%;">
    <p>Username: {{member.userName}}</p>
    <p>Name: {{member.firstName}}</p>
</div>

你应该尝试使用变化检测器参考(你可以在这里阅读:https://angular.io/api/core/ChangeDetectorRef) 您必须添加到构造函数中:

constructor(private cd: ChangeDetectorRef) { }

在重新分配 var 后,您应该添加(在订阅者内部):

cd.markForCheck();

它会“告诉”我们有变化请刷新 DOM

您的问题是由于使用了 this.route.snapshot。 顾名思义,快照只计算一次,不会随时间改变。当您执行第二次搜索时,由于当前组件相同,因此 Angular 不会再次销毁和创建该组件。相反,它会重复使用原始的(因此它不会 运行 ngOnInit 第二次)。

结果:

  • 快照永远不会改变(这就是为什么您的第二次搜索不会更新 member 列表的原因)
  • 搜索方法仅在您加载组件时 运行(这就是为什么它在您刷新页面时有效)

为了使您的代码正常工作,您需要在每次路线更改时调用您的搜索方法(即在您的订阅中)。这看起来像这样:

ngOnInit(): void {
    this.route.params.subscribe((params) => {
      this.content = params['content'];
      this.memberService.search(this.content).subscribe((response: Member[]) => {
        this.members = response;
      });
    });
}