4.9 Routing -- Query Parameters

一、概述

1. 在URL中查询参数是可选的key-value对,出现在?的右边。例如,下面的URL有两个查询参数,sortpage,对应的值分别是ASC2

example:http://example.com/articles?sort=ASC&page=2

2. Query params允许额外的应用程序状态被序列化到那些不能融入URL路径的URL中(比如?左边的任何东西)。常见的使用案例查询参数包括:分页集合中的当前页码,筛选条件,或排序标准。

二、Specifying qyery parameters

1. 查询参数被声明在路由驱动控制器中。例如,配置查询参数活动在articles路由中,它们必须被生命在controller:articles中。

2. 添加一个category查询参数将过滤出所有没有被归类为popular的文章,我们指定‘category‘作为controller:article的其中一个查询参数:

app/controller/articles.js

export default Ember.Controller.extend({
  queryParams: [‘category‘],
  category: null
});
  • 这设置一个在URL中category查询参数和controller:articlescategory属性的绑定。换句话说,一旦进入articles路由,URL中category查询参数的任何改变都会更新controller:articles中的category属性,反之亦然。

3. 现在我们仅仅需要为我们的类别过滤数的数组定义一个计算属性,articles摸吧将会渲染:

app/controllers/articles.js

export default Ember.Controller.extend({
  queryParams: [‘category‘],
  category: null,

  filteredArticles: Ember.computed(‘category‘, ‘model‘, function() {
    var category = this.get(‘category‘);
    var articles = this.get(‘model‘);

    if (category) {
      return articles.filterBy(‘category‘, category);
    } else {
      return articles;
    }
  })
});

用上面的代码,我们建立了以下操作:

  • 如果用户导航到/articlescategory将会是null,所以articles不回被过滤。
  • 如果用户导航到/articles?category=recentcategory将会被设置为"recent",所以articles将会被过滤。
  • 一旦在articles路由中,controller:articlescategory属性的任何改变都会引起URL更新查询参数。默认的,一个查询参数属性改变不回引起整个路由器的跳转(它不回调用model hookssetupController),它只是更新URL。

三、Link-To Helper

1. link-to辅助器支持指定查询参数通过子表达式辅助器query-params

// Explicitly set target query params
{{#link-to ‘posts‘ (query-params direction="asc")}}Sort{{/link-to}}

// Binding is also supported
{{#link-to ‘posts‘ (query-params direction=otherDirection)}}Sort{{/link-to}}

在上面的例子中,direction想必是controller:post中的一个查询参数属性,但是它可以是任何与post路由层级相关的controllers的一个direction属性,用提供的属性名匹配最里层的controller(leaf-most controller)。

2. link-to辅助器当确定"active"状态时会考虑查询参数,并且设置适当的类。激活状态是通过计算查询参数点击一个链接后是否最终相同决定。

您不必提供所有当前的,活动的查询参数是正确的。

四、Transitions To

1. Route#transitionTocontroller#transitionToRoute接受一个最终的参数,它是一个keyqueryParams的对象。

app/routes/some-route.js

this.transitionTo(‘post‘, object, {queryParams: {showDetails: true}});
this.transitionTo(‘posts‘, {queryParams: {sort: ‘title‘}});

// if you just want to transition the query parameters without changing the route
this.transitionTo({queryParams: {direction: ‘asc‘}});

2. 你也可以为URL transitions加上查询参数:

this.transitionTo("/posts/1?sort=date&showDetails=true");

五、Opting into a full transition(选择进入一个完全跳转)

1. 被提供给transitionTo或者link-to的参数仅仅对应在查询参数值中的一个变化,而不是路由层次上的变化,它不认为是一个完全跳转,这意味着像modelsetupControllerhooks默认的不回被启动,但是只有控制器属性将会用一个新的查询参数被更新,URL也是如此。

2. 但是一些查询参数改变从服务器上必要的加载数据,在这种情况下理想的是选择进入一个完全跳转。当一个controller的查询参数属性改变时,选择进入一个完全跳转,可以使用在相关controller的Route中可选的配置queryParams,并且设置查询参数的refreshModel配置属性为true

app/routes/articles.js

export default Ember.Route.extend({
  queryParams: {
    category: {
      refreshModel: true
    }
  },
  model(params) {
    // This gets called upon entering ‘articles‘ route
    // for the first time, and we opt into refiring it upon
    // query param changes by setting `refreshModel:true` above.

    // params has format of { category: "someValueOrJustNull" },
    // which we can just forward to the server.
    return this.store.query(‘articles‘, params);
  }
});

app/controllers/articles.js

export default Ember.Controller.extend({
  queryParams: [‘category‘],
  category: null
});

六、Update URL with replaceState instead

默认的,Embe将使用pushState来更新地址栏中的URL去相应一个controller的查询参数属性的变化,但是如果你想用replaceState代替(防止添加额外的条目到浏览器的历史记录中),你可以指定在Route的queryParams config hash中指定它。继续上面的例子:

app/routes/articles.js

export default Ember.Route.extend({
  queryParams: {
    category: {
      replace: true
    }
  }
});

注意,这个配置属性的名字和它的默认值falselink-to的有一点像,它也让你通过replace=true选择进入replaceState跳转。

七、Map a controller‘s property to a different query param key

1. 默认的,指定foo作为一个controller的查询属性将会绑定一个查询参数,它的key是foo,例如?foo=123。你也可以映射一个controller的属性到一个不同的查询参数key,通过使用下面的配置语法:

app/controllers/articles.js

export default Ember.Controller.extend({
  queryParams: {
    category: "articles_category"
  },
  category: null
});

这将会引起controller:articlescategory 属性改变去更新查询字符串articles_category,反之亦然。

2. 需要注意的是需要额外的定制,可以与查询参数数组中的字符串一起提供的查询参数。

app/controllers/article.js

export default Ember.Controller.extend({
  queryParams: [ "page", "filter", {
    category: "articles_category"
  }],
  category: null,
  page: 1,
  filter: "recent"
});

八、Default values and deserialization

在下面的例子中,controller的查询参数属性page被认为又一个默认值是1:

app/controllers/articles.js

export default Ember.Controller.extend({
  queryParams: ‘page‘,
  page: 1
});

这会影响在两个方面的查询参数的行为:

  • 查询参数的值转换为相同的数据类型作为默认值,例如一个URL从/?page=3变为/?page=2将会设置controller:articlespage属性为数字2,而不是字符串"2"。同样适用于默认的布尔值。
  • 当一个congroller的查询参数属性当前被设置为它的默认值,值不回被序列化到URL中。所以,在上面的例子中,如果page是1,URL将会类似/articles,但是一旦设置page的值为2,URL将会变成/articles?page=2

九、Sticky query param values(置顶的查询参数值)

1. 默认的,在Ember中查询参数值是"sticky",原因是,如果你改变一个查询参数,然后离开并重新输入路由,该查询参数的新值将被保留(而不是重置为默认值)。这是一个特别方便的默认为维护排序/过滤器参数当您在路由之间来回浏览。

2. 此外,这些粘查询参数值被记住/恢复根据加载到路径模型中。所以假定一个team路由有动态字段/:team_name并且controlle的查询参数"filter",如果你导航到/badgers并且通过"rookies"筛选,然后导航到/bear并且通过"best"筛选,然后导航到/potatoes并且通过"lamest"筛选,然后将定下面是导航栏链接:

{{#link-to ‘team‘ ‘badgers‘}}Badgers{{/link-to}}
{{#link-to ‘team‘ ‘bears‘   }}Bears{{/link-to}}
{{#link-to ‘team‘ ‘potatoes‘}}Potatoes{{/link-to}}

生成的link是:

<a href="/badgers?filter=rookies">Badgers</a>
<a href="/bears?filter=best">Bears</a>
<a href="/potatoes?filter=lamest">Potatoes</a>

这说明一旦变更查询参数,它被存储和绑到加载的路径的模型中。

3. 如果你想要重新设置一个查询参数,你有两种选择:

  • 明确的传入默认值到link-to或者transitionTo
  • 使用Route.resetController hook设置查询参数值返回到它们存在的路由或者路由模型改变之前的默认值。
  • 在下面的例子中,controller的page查询蚕食被设置为1,同时还作用于重定向之前的ArticlesRoute model。这样做的结果是,所有指向后退到出口的路由将会使用新设置的值1作为page查询参数的值。
  • app/routes/articles.js
  • export default Ember.Route.extend({
      resetController (controller, isExiting, transition) {
        if (isExiting) {
          // isExiting would be false if only the route‘s model was changing
          controller.set(‘page‘, 1);
        }
      }
    });

4. 在有些情况下,你可能不希望sticky查询参数的值作用于路由的模型,但宁愿重用一个查询参数的值甚至作为一个路由的模型改变。这可以通过设置到controller的queryParams config hash中的scope选项来实现:

app/controllers/articles/js

export default Ember.Controller.extend({
  queryParams: [{
    showMagnifyingGlass: {
      scope: "controller"
    }
  }]
});

5. 下面说明你可以如何重写一个单一的controller查询参数属性的scope和查询参数 URL key:

app/controllers/articles.js

export default Ember.Controller.extend({
  queryParams: [ "page", "filter",
    {
      showMagnifyingGlass: {
        scope: "controller",
        as: "glass",
      }
    }
  ]
});
时间: 2024-10-22 17:13:23

4.9 Routing -- Query Parameters的相关文章

[Angular] Preserve the current route’s query parameters when navigating with the Angular Router

When we redirect to a different route from within our component's code using the Router.navigate or from within a component template via a [routerLink] directive, we may want to preserve the current route’s query parameters and carry them on to the n

[Angular2 Router] Optional Route Query Parameters - The queryParams Directive and the Query Parameters Observable

In this tutorial we are going to learn how to use the Angular 2 router to pass optional query parameters from one route into another route. There are couple of ways of doing this from the source route perspective: we use the queryParams property in t

使用Retrofit时出现 java.lang.IllegalArgumentException: URL query string &quot;t={type}&amp;p={page}&amp;size={count}&quot; must not have replace block. For dynamic query parameters use @Query.异常原因

/** * Created by leo on 16/4/30. */ public interface GanchaiService { @GET("digest?t={type}&p={page}&size={count}") Call<List<GanChaiEntry>> ListGanchaiEntry(@Path("type") int type , @Path("count") int cou

[译]Angular-ui 之 Url Routing

? 前一篇 (Multiple Named Views)     下一篇 (The Components) ? 在你的应用中多数的状态都是基于特定的url地址的.Url Routing机制绝不是在状态机制之上后加的东西,而是一开始就是规划在最初设计方案(译注:angular-ui的设计方案)之中的(在实现url路由的同时独立的保持状态).下面代码展示了你如何设置一个url: Most states in your application will probably have a url asso

Solr 使用自定义 Query Parser(短语查询,精准查询)

原文出处:http://blog.chenlb.com/2010/08/solr-use-custom-query-parser.html 由于 Solr 默认的 Query Parser 生成的 Query 一般是 “短语查询”,导致只有很精确的结果才被搜索出来.大部分时候我们要分词后的 BooleanQuery.一年半前有篇关于 solr 使用自定义的 QueryParser 的文章.使用这个方法在 solr 中可以用自己的 Query Parser. 按照那篇文章,分别扩展:QParser

HQL: The Hibernate Query Language

Chapter 14. HQL: The Hibernate Query Language 14.1. Case Sensitivity 14.2. The from clause 14.3. Associations and joins 14.4. Forms of join syntax 14.5. Referring to identifier property 14.6. The select clause 14.7. Aggregate functions 14.8. Polymorp

Jersey(1.19.1) - Extracting Request Parameters

Parameters of a resource method may be annotated with parameter-based annotations to extract information from a request. A previous example presented the use @PathParam to extract a path parameter from the path component of the request URL that match

solr管理界面下统计多个时间段的数据 facet.query

在Raw Query Parameters参数里面输入时间段即可 如下图所示: facet.query=publishTime:[2017-06-05T00:00:00Z TO 2017-06-07T00:00:00Z] &facet.query=publishTime:[2017-06-07T00:00:00Z TO 2017-06-09T00:00:00Z] &facet.query=publishTime:[2017-06-09T00:00:00Z TO 2017-06-12T00:

angularJs模块ui-router之路由控制

原文地址:http://bubkoo.com/2014/01/02/angular/ui-router/guide/url-routing/ 在你的应用中大多数状态都有与其相关联的 url,路由控制不是设计完成 state 之后的事后想法,而是开始开发时就应该考虑的问题. 这里是如何设置一个基本url. $stateProvider .state('contacts', { url: "/contacts", templateUrl: 'contacts.html' }) 当我们访问i