2013-04-04 83 views
4

我有一个非常基本的路由设置,它允许我首先显示某个对象的“所有”记录。然后,如果用户选择一个下拉菜单,他们可以使用日期过滤掉。如何在Emberjs中使用嵌套路由/控制器中的“needs”RC 2

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

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

从下面什么是缺少的是,在App.RecordsDateRoute我需要将“记录”控制器的内容更改为一个新的过滤器(此日期)和我似乎做的一切只是转储把手模板和显示什么 - 甚至当我尝试的RecordsDateRoute

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 }); 
    } 
}); 

回答

3

随着RC2的setupController方法中使用一些简单的像

this.controllerFor("records").set('content', App.Record.find(new Date(model.loaded))) 

,其他控制器的情况下,可以通过“controllers.controllerName检索“,在y ou情况将会是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)),找到()预计一个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

+0

的setupController方法中我有涉及加载从嵌套路线日期有点相关的问题,我已经放置** 50个**点柜面任何人想看看赏金:** http://bit.ly/15YQscl**。非常感谢。 – brg 2013-10-22 01:00:25

+0

但在这里你使用了'needs:'在一条路径中。那么路由是否可以访问'records'控制器属性或'records'路由属性?是否包含控制器意味着您获得其控制器属性和路由属性? – ahnbizcad 2015-04-05 19:34:49

2

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

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

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

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

以下缺少的是应用程序内部。RecordsDateRoute我需要将“记录”控制器的内容更改为新的过滤器(这次是按日期),而我似乎做的所有事情只是转储句柄模板并不显示任何内容 - 甚至当我尝试使用像this.controllerFor("records").set('content', App.Record.find(new Date(model.loaded)))这样简单的东西时的RecordsDateRoute

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)); 
    } 
}); 
相关问题