【问题标题】:How to keep pagination data during navigations in Angular?如何在 Angular 中导航期间保留分页数据?
【发布时间】:2021-03-31 03:58:43
【问题描述】:

我有一个包含列表和详细信息页面的应用程序。在列表页面中,表格具有分页功能,并且还有一个用于过滤列表项的搜索框。单击列表中的项目时,它会打开相关记录的详细信息。我想知道当我导航到详细信息页面时保留列表页面的分页和过滤参数的正确方法是什么,然后在返回此列表页面时使用这些参数。我的意思是,用户在列表的第三页,然后单击记录的详细信息图标。然后打开详细信息页面,然后单击该页面上的返回按钮。我希望用户可以通过获取他之前发送的参数值再次导航到第三页。如果我能得到这些值,那么剩下的当然没问题。

我应该为此使用NavigationExtras 或其他吗?

【问题讨论】:

    标签: javascript angular typescript routes navigation


    【解决方案1】:

    有多种方法可以实现此类功能。一般情况下,需要在列表组件 OnDestroy 期间将最后一次搜索状态(搜索值、页面、搜索结果等)保存在某处,然后在列表组件的 OnInit 钩子中使用。下面是一个使用服务的例子:

    列表组件

    constructor(private preserveSearch: PreserveSearchService){}
    
    ngOnInit() {
        this.recoverLastSearchValue();
    }
    
    ngOnDestroy() {
        this.preserveSearch.searchState = {
            searchValue: this.searchControl.value,
            results: this.data,
            resultsLength: this.resultsLength,
        };
    }
    
    recoverLastSearchValue() {
        const lastSearch = this.preserveSearch.searchState;
        if (lastSearch) {
            this.searchControl.setValue(lastSearch.searchValue, {
                emitEvent: false,
                emitModelToViewChange: false,
            });
            this.data = lastSearch.results;
            this.resultsLength = lastSearch.resultsLength;
        }
    }
    

    搜索状态服务

    import { Injectable } from "@angular/core";
    import { SearchResultsItem } from "app/_models/search";
    
    interface PreservedSearchState {
        searchValue: string;
        results: SearchResultsItem[];
        resultsLength: number;
    }
    
    @Injectable({
        providedIn: "root",
    })
    export class PreserveSearchService {
        private lastSearch: PreservedSearchState;
    
        get searchState(): PreservedSearchState {
            return this.lastSearch;
        }
    
        set searchState(lastSearch: PreservedSearchState) {
            this.lastSearch = lastSearch;
        }
    
        constructor() {}
    }
    

    【讨论】:

    • 感谢您的回复。如果我想使用一个类而不是PreserveSearchService 怎么办?我的意思是已经有一个类似方法的类,我想将PreserveSearchService 中的逻辑移动到该类。
    • 第二个的问题是,通过路由传递搜索参数然后在返回此页面时在导航参数中检索它们是否合乎逻辑?
    • 确保你可以在任何你想要的地方添加PreserveSearchService的逻辑。这只是一个例子。关于查询参数的使用——这是一种经典的分页方法。这是提供 myshop.com/products?page=2&searchTerm=something 之类的链接的最简单方法在分页列表等中。
    • 我尝试通过类使用,但很遗憾没有成功。
    • 究竟是什么不起作用?你是如何在那里实现它的?
    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 2021-12-12
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多