如果我使用renderTemplate如何在ember中刷新路由?

时间:2015-06-09 09:09:39

标签: javascript ember.js

我的两条路线有相同的模板和控制器,所以我的路线想要使用renderTemplate相同的模板和控制器,如:

OrderRoute = Ember.Route.extend 
  model: (params)->  
    Product.findAll(params)

  setupController: (controller, model)->
    @controllerFor('product').set('model', model)

  renderTemplate: ->
    @render 'products',
      controller: 'products'

  actions:
    queryParamsDidChange: ->
      @refresh()

控制器:

ProductController = Ember.Controller.extend
  queryParams: ['number']

  number: null

代码看起来没问题,但是当我使用时我发现query params无效。

jsbin:http://emberjs.jsbin.com/gegonemadu/1/edit

我无法谷歌任何关于这个问题。

我知道如果我使用OrderRouteOrderController路由和控制器具有相同的名称,那么所有的想法都可以。但我的2路线想要拥有相同的模板,就像:

  

/顺序
  /其他
  2路由网址使用product模板和控制器

我正在使用{{partial}},就像:http://emberjs.jsbin.com/bifanateku/1/edit?html,js,console

这可行,但我想如果我可以使用renderTemplate,代码会更清晰。

也许有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

对于查询参数,控制器和路径应该一起工作。

在您的情况下,您正在使用order路由,该路由需要来自您没有的order控制器的查询参数。

所以你要么为路线定义一个不同的控制器,e。克。

contollerName: 'product',

或将查询参数定义移动到order控制器并将它们绑定到product控制器的属性。

这是一个毛茸茸的设置,我相信你可能首先doing something wrong

更新1

你不应该使用控制器。使用组件。

Ember正在弃用控制器并仅使用组件。但就目前而言,控制器仍然是您网页的切入点。其余应该是组件!

这是你应该怎么做的:

App.Router.map(function() {
  this.route('foo');
  this.route('bar')
});


App.FooController = Ember.Controller.extend({
  queryParams: ['number'],
  number: null
});


App.BarController = Ember.Controller.extend({
  queryParams: ['number'],
  number: null
});
  <script type="text/x-handlebars" data-template-name="foo">
    {{x-product number=number}}
  </script>


  <script type="text/x-handlebars" data-template-name="bar">
    {{x-product number=number}}
  </script>


  <script type="text/x-handlebars" data-template-name="components/x-product">
    Search Product:
    {{input value=number}}

    <ul>
      {{#each model}}
        <li>{{this}}</li>
      {{/each}}
    </ul>
  </script>

演示:http://emberjs.jsbin.com/xixeto/1/edit?html,js,output