繁体   English   中英

分页时未更新过滤列表

[英]Filtered list not updated on pagination

  • 灰烬:1.1.2
  • 灰烬数据:1.0.0-beta.4 + canary.c15b8f80
  • 把手:1.0.0
  • 的jQuery:1.10.2

我有一个对象列表,可以根据某个属性值进行过滤,例如,所有帖子与仅发布的帖子。 我还创建了2条路由,因此可以使用url访问两个列表:

App.Router.map ->
  @resource 'posts', ->    # '/posts'
    @route 'published'     # '/posts/published'

这两个列表使用相同的模板:

App.PostsRoute = Em.Route.extend
  model: ->
    @get('store').find 'post'

App.PostsIndexRoute = Em.Route.extend
  model: ->
    @modelFor 'posts'

App.PostsPublishedRoute = Em.Route.extend
  model: ->
    @modelFor('posts').filter( (item) ->
      item.get('publishAt') <= new Date()
    )
  renderTemplate: (controller) ->
    @render 'posts/index',
      controller: controller

# posts.hbs
  ...
  {{#link-to 'posts.index'}}All{{/link-to}}
  {{#link-to 'posts.published'}}Published{{/link-to}}

  {{outlet}}

# posts/index.hbs
  {{#each}}
    <li>...</li>
  {{/each}}

  {{link-to showMore}}Show More{{/link-to}}

基本控制器中的showMore操作将请求发送到(Rails)后端,该后端用下一页进行响应。

App.PostsController = Em.ArrayController.extend
  actions:
    showMore: ->
      @store.find 'post',
        page: 2

显示未过滤的列表时,此showMore可以按预期工作。 为了使示例简单,我对页面值进行了硬编码。

但是,当显示过滤的列表时, showMore确实会发送AJAX请求,但是页面不会使用扩展的对象列表进行更新。 当我在All和已Published之间切换时,已Published列表更新。

调用showMore操作时,将发送AJAX请求,但不会更新列表。 这是由于以下事实:仅在输入路线时才调用路线的model挂钩。

您需要通过过滤App.PostPublishedController的集合来确保在帖子更改时更新列表:

App.PostPublishedController = Ember.ArrayController.extend
  needs: ['posts']
  posts: Ember.computed.alias('controllers.posts.content')

  content: ( ->
    @get('posts').filter( (item) ->
      item.get('publishAt') <= new Date()
    )
  ).property('posts.[]')

但是我要做的是在路由器方案中映射页面:

App.Router.map ->
  @resource 'firstPostsPage', { path: '/posts' }
  @resource 'posts', { path: '/posts/:page' }, ->
    @route 'published'

App.PostsRoute = Em.Route.extend
  model: (params) ->
    @get('store').find 'post',
      page: params.page

App.FirstPostsPageRoute = Em.Route.extend
  redirect: ->
   // Redirect '/posts' to '/posts/1'
   this.transitionTo('posts', { page: 1 });

然后,以下路由定义将按预期工作,而无需在PostPublishedController进行过滤

App.PostsIndexRoute = Em.Route.extend
  model: ->
    @modelFor 'posts'

App.PostsPublishedRoute = Em.Route.extend
  model: ->
    @modelFor('posts').filter( (item) ->
      item.get('publishAt') <= new Date()
    )
  renderTemplate: (controller) ->
    @render 'posts/index',
      controller: controller

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM