Angular : header 搜索表单未加载多次
Angular : header search form does not load multiple times
我有 header 搜索图标,点击时会显示输入和按钮的小弹出窗口。如果用户搜索任何输入,那么我会将用户重定向到结果页面。我有单独的 header 组件和搜索结果。我正在将带有公共服务的搜索输入从 header 传递到搜索结果。
这是第一次运行良好。当我输入新文本并进行搜索时,什么也没有发生。它不会将搜索输入传递给搜索结果组件,也不会再次加载搜索结果。
header模板html
<a
#closeSearchForm
href="#"
data-title="Search"
class=""
id="dropdownMenuButton1"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
><img src="assets/images/icons/search.png" alt=""
/></a>
<span class="tooltiptext">Search</span>
<div
class="member_login search_menu_dropdown dropdown-menu"
aria-labelledby="dropdownMenuButton1"
>
<form [formGroup]="searchForm" (ngSubmit)="onSubmitSearch()">
<div class="search_menu_wrap">
<div class="form-group">
<input
type="text"
class="form-control"
placeholder="Search here...."
formControlName="searchInput"
[ngClass]="{ error_border: submitted1 && sf.searchInput.errors }"
/>
<div *ngIf="submitted1 && sf.searchInput.errors" class="text-danger">
<div *ngIf="sf.searchInput.errors.required">Search text is required</div>
</div>
</div>
<div class="form-group">
<button class="btn" type="submit">
Search</button>
</div>
</div>
</form>
</div>
header ts代码
onSubmitSearch() {
this.submitted1 = true;
if (this.searchForm.invalid) {
this.loading1 = false;
return;
}
this.loading1 = true;
if (this.sf.searchInput.value) {
this.closeSearchForm.nativeElement.click();
var searchValue = this.sf.searchInput.value;
// this.searchForm.reset();
// Object.keys(this.searchForm.controls).forEach(key => {
// this.searchForm.get(key).setErrors(null) ;
// });
this.commonModelService.data = searchValue;
this.router.navigate(['search-results']);
}
}
通用模型服务代码-用于传递搜索输入
import { Injectable } from '@angular/core';
@Injectable()
export class CommonModelService{
data:any
}
搜索结果组件 ts
ngOnInit(): void {
this.searchValue = this.commonModelService.data;
this.getSearchResults(); <!-- this function will call api and show data in html -->
}
我不明白哪里出了问题。现在它只是第一次工作。搜索应该可以在任何时候使用用户提供的任何输入。
当用户尝试搜索时,将搜索输入从 header 组件传递到搜索组件并实现搜索功能在任何页面上随时可用的最佳解决方案是什么?
请多多指教。谢谢
如果您已经在搜索结果中,您的重定向代码将不会重新呈现组件,如果不重新呈现,您的 search.result.component-> ngOninit
将不会触发并加载结果。
与其直接传递数据,不如传递可观察对象和行为对象。
搜索结果组件 ts
ngOnInit(): void {
this.commonModelService.search$.subscribe((searchInput) => {
if(searchInput !=== undefined){ // we want to capture empty string
this.getSearchResults()
}
})
}
通用模型服务代码 - 用于传递搜索输入
import { Injectable } from '@angular/core';
public search$ = new BehaviorSubject(undefined) // if undefined initially we don't do anything.
@Injectable()
export class CommonModelService{
data:any
}
BehavourSubect 将在第一次订阅时 return 最后一个事件值,在随后的情况下,当您已经在页面上时,它将像常规主题一样推送值。
建议:每次在 OnDistory
上也删除订阅
this.commonModelService.search.next(searchValue);
this.router.navigate(['search-results']);
我有 header 搜索图标,点击时会显示输入和按钮的小弹出窗口。如果用户搜索任何输入,那么我会将用户重定向到结果页面。我有单独的 header 组件和搜索结果。我正在将带有公共服务的搜索输入从 header 传递到搜索结果。
这是第一次运行良好。当我输入新文本并进行搜索时,什么也没有发生。它不会将搜索输入传递给搜索结果组件,也不会再次加载搜索结果。
header模板html
<a
#closeSearchForm
href="#"
data-title="Search"
class=""
id="dropdownMenuButton1"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
><img src="assets/images/icons/search.png" alt=""
/></a>
<span class="tooltiptext">Search</span>
<div
class="member_login search_menu_dropdown dropdown-menu"
aria-labelledby="dropdownMenuButton1"
>
<form [formGroup]="searchForm" (ngSubmit)="onSubmitSearch()">
<div class="search_menu_wrap">
<div class="form-group">
<input
type="text"
class="form-control"
placeholder="Search here...."
formControlName="searchInput"
[ngClass]="{ error_border: submitted1 && sf.searchInput.errors }"
/>
<div *ngIf="submitted1 && sf.searchInput.errors" class="text-danger">
<div *ngIf="sf.searchInput.errors.required">Search text is required</div>
</div>
</div>
<div class="form-group">
<button class="btn" type="submit">
Search</button>
</div>
</div>
</form>
</div>
header ts代码
onSubmitSearch() {
this.submitted1 = true;
if (this.searchForm.invalid) {
this.loading1 = false;
return;
}
this.loading1 = true;
if (this.sf.searchInput.value) {
this.closeSearchForm.nativeElement.click();
var searchValue = this.sf.searchInput.value;
// this.searchForm.reset();
// Object.keys(this.searchForm.controls).forEach(key => {
// this.searchForm.get(key).setErrors(null) ;
// });
this.commonModelService.data = searchValue;
this.router.navigate(['search-results']);
}
}
通用模型服务代码-用于传递搜索输入
import { Injectable } from '@angular/core';
@Injectable()
export class CommonModelService{
data:any
}
搜索结果组件 ts
ngOnInit(): void {
this.searchValue = this.commonModelService.data;
this.getSearchResults(); <!-- this function will call api and show data in html -->
}
我不明白哪里出了问题。现在它只是第一次工作。搜索应该可以在任何时候使用用户提供的任何输入。
当用户尝试搜索时,将搜索输入从 header 组件传递到搜索组件并实现搜索功能在任何页面上随时可用的最佳解决方案是什么?
请多多指教。谢谢
如果您已经在搜索结果中,您的重定向代码将不会重新呈现组件,如果不重新呈现,您的 search.result.component-> ngOninit
将不会触发并加载结果。
与其直接传递数据,不如传递可观察对象和行为对象。
搜索结果组件 ts
ngOnInit(): void {
this.commonModelService.search$.subscribe((searchInput) => {
if(searchInput !=== undefined){ // we want to capture empty string
this.getSearchResults()
}
})
}
通用模型服务代码 - 用于传递搜索输入
import { Injectable } from '@angular/core';
public search$ = new BehaviorSubject(undefined) // if undefined initially we don't do anything.
@Injectable()
export class CommonModelService{
data:any
}
BehavourSubect 将在第一次订阅时 return 最后一个事件值,在随后的情况下,当您已经在页面上时,它将像常规主题一样推送值。 建议:每次在 OnDistory
上也删除订阅this.commonModelService.search.next(searchValue);
this.router.navigate(['search-results']);