3

我有一个自定义字段,可让您过滤模型列表(可以说在某些 ArrayController 上)

  PersonApp.SearchField = Ember.TextField.extend({
      keyUp: function(e) {
          var search = this.get('value');
          model = PersonApp.Page.create({term: search});
          this.get('controller.target').transitionTo('person.search', model);       
      }
  });

这是我用于分页和过滤/搜索的非常简单的模型

  PersonApp.Page = Ember.Object.extend({                                            
      term: ''
  });

我添加了一条适用于上述模型的简单路线

  PersonApp.Router.map(function(match) {
      this.resource("person", { path: "/" }, function() {
          this.route("page", { path: "/page/:page_id" });
          this.route("search", { path: "/search/:page_term" });                     
      });
  });

最后这是我的路线 setupController 方法

 PersonApp.PersonSearchRoute = Ember.Route.extend({
     setupController: function(controller, model) {
         this.controllerFor('person').set('filterBy', model.get('term'));
     }
 });

该过滤器确实有效(这意味着它确实使用我上面的 setupController 中的 filterBy 修改了 ArrayController)。

但在网址中,我看到以下内容

http://www.google.com/#/search/<PersonApp.Page:ember517>

代替

http://www.google.com/#/search/foo

有什么办法可以修改模型/路由/设置控制器来显示文本吗?

另外 - 这样的事情应该只是索引/主路由上的一个简单“事件”,而不是我上面的自定义路由吗?如果是这样,我仍然可以修改 url(我假设不是 - 所以这就是我现在将它作为路由的原因)

4

1 回答 1

3

您需要serialize使用PersonSearchRoute. 根据serialize文档serialize是:

您可以实现一个挂钩,将路由模型转换为 URL 的参数。

对于您的示例:

PersonApp.PersonSearchRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    this.controllerFor('person').set('filterBy', model.get('term'));
  },
  model: function(params) {
    return PersonApp.Page.create({term: params.page_term});
  },
  serialize: function(model) {
    return { page_term: model.term };
  }
});

JSBin 示例

这将显示正确的 URL:#/search/foo但如果您直接导航到该 URL,或在该 URL 处刷新页面,您将需要使用model钩子来查找并使用提供的动态参数返回模型。从model钩子返回的值是直接导航到 URL 时model传入的参数setupController,但如果使用 atransitionTo或 a {{#linkTo}},则通过这些调用传递的对象将直接传递给setupController.

于 2013-03-13T01:48:13.493 回答