4

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

我最近升级到 RC2 并意识到“需要”已经替换或即将替换 controllerFor。

I'm curious how I can use "needs" in the below situation where I need the nested / inner route for "records.date" to change the content for the parent "records" route when a date is selected.

下面缺少的是在 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 });
  }
});
4

2 回答 2

3

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

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

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

于 2013-04-05T01:40:31.000 回答
2

我最近升级到 RC2 并意识到“需要”已经替换或即将替换 controllerFor。

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

I'm curious how I can use "needs" in the below situation where I need the nested / inner route for "records.date" to change the content for the parent "records" route when a date is selected.

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

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

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));
  }
});
于 2013-04-05T03:50:00.177 回答