我有一个非常基本的路线设置,允许我首先显示某些对象的“所有”记录。然后,如果用户选择下拉列表,则可以使用日期对其进行过滤。
我最近升级到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 });
}
});
答案 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。
要从路由挂钩访问另一个控制器,您应该继续使用controllerFor
。 Controller.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));
}
});