如何在emberjs RC 2中使用嵌套路由/控制器的“需求”

时间:2013-04-04 21:29:37

标签: ember.js

我有一个非常基本的路线设置,允许我首先显示某些对象的“所有”记录。然后,如果用户选择下拉列表,则可以使用日期对其进行过滤。

我最近升级到RC2并意识到“需求”已经取代或即将取代controllerFor。

我很好奇如何在以下情况下使用“需求”,我需要“records.date”的嵌套/内部路由,以便在选择日期时更改父“记录”路径的内容。 / p>

下面缺少的是App.RecordsDateRoute内部我需要将“记录”控制器的内容更改为新的过滤器(按此日期),我似乎只是转储把手模板和什么都不显示 - 当我尝试使用像

这样简单的东西时
this.controllerFor("records").set('content', App.Record.find(new Date(model.loaded)))

来自RecordsDateRoute

的setupController方法
App.Router.map(function(match) {
  return this.resource("records", { path: "/" }, function() {
    return this.route("date", { path: "/:date_loaded" });
  });
});

App.RecordsController = Ember.ArrayController.extend({
  selected: 0,
  dates: Ember.computed(function() {
    return App.Date.find();
  }).property()
});

App.RecordsIndexRoute = Ember.Route.extend({
  model: function() {
    this.controllerFor("records").set("selected", 0);
    return App.Record.find();
  }
});

App.RecordsDateRoute = Ember.Route.extend({
  model: function(params) {
    //the controllerFor below seems to be working great ... but what about needs?
    this.controllerFor("records").set("selected", params.date_loaded);
    return App.Date.create({ loaded: params.date_loaded });
  }
});

2 个答案:

答案 0 :(得分:3)

使用rc2,可以通过“controllers.controllerName”检索其他控制器的实例,在这种情况下,它将是this.get('controllers.records')

“needs”声明使引用控制器排序引入另一个控制器的引用;在您的情况下,日期控制器将是:

App.RecordsDateRoute = Ember.Route.extend({
  needs: ['records'],
  model: function(params) {
    this.get("controllers.records").set("selected", params.date_loaded);
    return App.Date.create({ loaded: params.date_loaded });
  }
});

关于App.Record.find(new Date(model.loaded)),find()需要一个id或一个对象,其键和值将用于过滤模型集合,但是你给它一个Javascript日期。

您的意思是App.Record.find(new App.Date(model.loaded)),还是像App.Record.find({ loaded: model.loaded }) /* assuming it's already a Date */

在路由中还有一个initController(controller, model)方法,也许你可以使用它来代替“重载”具有太多职责的model()方法。 http://emberjs.com/api/classes/Ember.Route.html#method_setupController

答案 1 :(得分:2)

  

我最近升级到RC2并意识到“需求”已经取代或即将取代controllerFor。

要从路由挂钩访问另一个控制器,您应该继续使用controllerForController.needs用于控制器之间的通信,它取代了控制器上现在已弃用的controllerFor方法。 AFAIK没有计划在ember Routes上弃用controllerFor。

  

我很好奇如何在以下情况下使用“需求”,我需要“records.date”的嵌套/内部路由,以便在选择日期时更改父“记录”路径的内容。 / p>

对于这个用例,最好坚持使用controllerFor。可以通过这种方式使用需求,方法是指定App.RecordsDateController needs = ['records']您可以通过路由controller.get('controllers.records')挂钩中的setupController访问记录控制器。

  

下面缺少的是App.RecordsDateRoute内部我需要将“记录”控制器的内容更改为新的过滤器(按此日期),我似乎只是转储把手模板和什么都不显示 - 当我尝试在RecordsDateRoute的setupController方法中使用像this.controllerFor("records").set('content', App.Record.find(new Date(model.loaded)))之类的简单东西时

App.RecordsDateRoute = Ember.Route.extend({
  model: function(params) {
    return App.Date.create({ loaded: params.date_loaded });
  },
  setupController: function(controller, model) {
    var recordsController = this.controllerFor("records");
    // Moved this from model hook, since here you are 'setting up a controller'
    recordsController.set("selected", model.date_loaded);
    // Set query based on current route's model
    var query = { loaded: model.loaded };
    recordsController.set("content", App.Record.find(query));
  }
});