强制 ui-路由器在查询字符串更改时重新加载

Force ui-router to reload on querystring changes

我有一个状态定义如下:

$stateProvider.state("app.search", {
    url: "/search?q",
    templateUrl: "App/Search.html",
    controller: "SearchController as vm",
});

当我想导航到搜索页面并指定搜索词时,我可以这样做:

$location.path("search").search({ q: "stuff" });

根据 #/search?q=stuff,有效解析为 url。如果我随后将搜索词更改为 "things",搜索页面将正确重新激活并按预期进行搜索。

但是,我希望能够指定 "random" 查询字符串参数 ,这些参数在我的 url 中没有定义,然后让那些参数也重新加载状态。 (注意:这就是为什么我使用 $location.path 而不是 $state.go 来更改 URL 的原因)。例如,如果我正在寻找食物,我的 URL 可能是:

#/search?q=stuff&type=food

然后我可能会过滤 spice 级别,这可能会将 URL 更改为:

#/search?q=stuff&type=food&spice=medium

(等)。

问题是,因为我还没有定义所有其他查询字符串参数(本例中的 typespice),ui-router 没有重新加载我的页面。

我不能将 $state.go{ reload: true } 一起使用,因为它会忽略未指定的参数。

有没有一种方法可以使用 "unspecified" 查询字符串参数触发页面重新加载? This post 建议我可以使用路由 /search*但这似乎对我不起作用。

我还没有找到使用 ui-router 执行此操作的好方法。如果您愿意牺牲一点完整性,您可以为查询参数使用另一种格式。您可以使用单个 http url 查询参数对象并使用自定义格式列出所有条件。

例如

/search/q?stuff:type=food:spice=cinnamon

路由设置如下:

$stateProvider.state("app.search", {
    url: "/search?q",
    templateUrl: "App/Search.html",
    controller: "SearchController as vm",
});

并使用额外参数进行导航:

$state.go('app.dashboard', { q: 'stuff:type=dessert:spice=cinnamon'});

访问路由参数:

$state.params.q

然后您可以只解析 'stuff' 值,然后解析传入的每个 name/value 对。

PS> 我不确定冒号 (:) 分隔符是否有效,但它用于说明所提出的想法。