似乎在嵌套路由的情况下,在调用任何model
挂钩之前调用每个路由的setupController
挂钩。那么子路径如何安全地访问父模型呢?
就我而言,模型实际上并不是持久化实体。它们都是基于params在模型钩子中生成的。所以我不认为Parent.find()
/ ajax / promise似乎是要走的路。理想情况下,父模型应该可以通过ParentController
访问,不是吗?或者这种方法不符合最佳做法?
App.Router.map(function() {
this.resource("parent", { path: "parent/:name" }, function() {
this.route('child');
});
});
App.ParentRoute = Ember.Route.extend({
model: function(params) {
// build a model here, based on params.
// no asynch stuff happening, should be good to go.
return { lastName: params.name }
},
setupController(controller, model) {
controller.set('model', model);
}
});
App.ChildRoute = Ember.Route.extend({
model: function(params) {
parentModel = this.controllerFor('parent').get('model');
return {lastName: parentModel.get('name') + 'son' };
// parent Model is null
// need the parent model HERE,
// but I can't get it through the controller yet
// as setupController in the parent route hasn't been called yet
}
});
答案 0 :(得分:28)
modelFor
我怎么想念那个?
App.ChildRoute = Ember.Route.extend({
model: function(params) {
parentModel = this.modelFor('parent');
return {lastName: parentModel.get('name') + 'son' };
}
});
答案 1 :(得分:1)
doublea的答案仍然适用于Ember 3.x,但对该路线的样板语法稍作更改。此外,get
不再是必需的,但将其保留在此处不会造成任何伤害。这是3.x语法:
import Route from '@ember/routing/route';
export default Route.extend({
model(params) {
parentModel = this.modelFor('parent');
return {lastName: parentModel.name + 'son' };
}
});
对于至少到整个Ember 3为止的Ember 2.16,获取有关父级路由信息的另一种方法是使用RouterService
currentRouteName
和currentUrl
之类的方法对于显示很有帮助,尽管最好在有更好的选择时避免花哨的字符串解析。您还可以使用路由器服务的transitionTo
来更改来自组件的路由。
路由器服务可以这样使用:
从'@ ember / service'导入{作为服务注入};
export default Component.extend({
router: service(),
actions: {
clickedAThing() {
this.router.transitionTo('some.route')
}
}
})