1

我正在使用 ember pre 1.0 编写一个简单的排序/分页控制器。当用户单击表格上的列标题时,我想更改控制器上的排序属性。我有一个简单的动作助手,它指向我的路由器 sortUser 方法,但我似乎无法传递路由可以用作参数的原始字符串,例如“用户名”或“id”

我的网址也似乎坏了(获取此网址)

http://localhost:8000/#/sort/undefined

代替

http://localhost:8000/#/sort/username

先感谢您

<table width="250px">
<thead>
<th><a {{action sortUsers "id" href=true}}>id</th>                                        
<th><a {{action sortUsers "username" href=true}}>username</th>
<th>update</th>
<th>delete</th>
</thead>
<tbody>

这是我的路由器(消除了一些复杂性,但它是嵌套路由)

PersonApp.Router = Ember.Router.create({
  root: Ember.Route.extend({
    index: Ember.Route.extend({
      route: '/',
      paginateUsers: Ember.Route.transitionTo('paginated'),
      sortUsers: Ember.Route.transitionTo('index.sort.index'),
      connectOutlets: function(router, context) {
        router.get('applicationController').connectOutlet('person', router.get('store').findAll(PersonApp.Person));
      },
      index: Ember.Route.extend({
        route: '/'
      }),
      paginated: Ember.Route.extend({
        route: '/page/:page_id',

        connectOutlets: function(router, context) {
          router.get('personController').set('selectedPage', context.page_id);
        },

        exit: function(router) {
          router.get('personController').set('selectedPage', undefined);
        }
      }),
      sort: Ember.Route.extend({
        route: '/sort/:column',

        serialize: function(router, context) {
          if (context) { return { sort: context.sort } }
          return {sort: undefined}
        },

        deserialize: function(router, context) {
          return { sort: context.column }
        },

        connectOutlets: function(router, context) {
          router.set('personController.sortProperties', ['username']);
          router.get('personController').set('selectedPage', 1);
        },

更新

我现在有一个完整的jsfiddle(沿着侧过滤器+分页排序)

4

1 回答 1

1

我认为您可能有两个可能导致您的问题的较小问题的组合。

  1. 您的 sortUsers 操作指向您的排序路径下的索引路径。我在您包含的代码中没有看到这样的路线。我只看到一个 sort/:column 路由。

    我昨天在获得与此工作类似的路线时遇到了问题,最终得到了类似以下的内容来获得正确的“上下文”。我完全不确定你是否应该这样做,但它让事情对我有用。

    sortUsers: function(router, event) {
      // you can now also console.log here as suggested by sly7_7
      router.transitionTo('index.sort', event.context);
    },
    
  2. 您的序列化/反序列化方法看起来不正确。它们可能很好,但从我的外部角度来看,它们看起来很破碎。序列化应该将您拥有的任何内容作为“上下文”并将其转换为 url 参数。反序列化应该做相反的事情,并返回与序列化作为输入得到的完全相同的结果。

    serialize: function(router, context) {
      return {
        column: context // you are passing a string so let's just put that in the url as is 
      }
    },
    deserialize: function(router, urlParams) {
      return urlParams.column; // just return the straight string from the url
    }
    

我可能遗漏了一些细节,但这看起来像是一些可能使您的过渡运行的更改。

另外,请确保您要求路由器记录它在做什么......然后您还可以更好地跟踪您的进度。启用记录:真

于 2012-09-21T13:51:46.340 回答