我有以下路由器:
router.js:
var Router = Ember.Router.extend({
location: AppENV.locationType
});
Router.map(function() {
this.resource('groups', { path: '/groups' }, function() {
this.resource('members', { path: ':group'});
});
});
export default Router;
这会在路线/groups
和路线/groups/<groupId>
处呈现一个侧边栏,它会显示侧边栏以及所选组内的成员。应用程序的主视图包含有关所选组的信息。
到目前为止这一切都很好。但是我的想法是,在创建新组时,我希望使用路由/groups/new
显示未保存的组,并在应用程序的主视图中显示有关该特定未保存组的详细信息。
所以,我有成员的这条路线:
/routes/members.js:
export default Ember.Route.extend({
model: function (params) {
return Ember.RSVP.hash({
members: this.store.find('member', {group: params.group}),
group: this.store.find('group', params.group)
});
},
setupController: function(controller, model){
this._super(controller,model);
this.controllerFor('group').set("group", model.group);
},
renderTemplate: function(controller, model) {
this.render('members',{
outlet:'sidebar-members'
});
this.render('group', {controller: 'group'});
}
});
这将加载当前所选组的成员和所选组本身,并呈现两个模板:成员侧栏列表和包含组模板的主视图。同样,这适用于已有的条目。
现在我发现这个stackoverflow [1]描述了我应该能够在路由/groups/new
下创建一个新创建的组。所以,我在上面显示的成员路由中添加了一个序列函数:
serialize: function(model, params) {
if (model && model.get('isNew')) {
// corresponds to path '/groups/:group'
return { group: 'new'}
}
return this._super(model, params);
},
我现在可以使用组控制器创建一个新组并转换到该路由:
控制器/ groups.js:
export default Ember.ArrayController.extend({
actions: {
create: function() {
var group = this.store.createRecord('group', {
name: 'test'
});
this.transitionToRoute('members', group);
},
}
});
这适用于侧边栏:添加了一个新组。路线/groups/new
显示在浏览器中。但是,新组未传递到主视图,后者呈现组模板。组变量似乎在模板内和组控制器中未定义。我没有在模型上设置id并将id设置为“new”,我尝试了两种方法。似乎没有任何改变。
是否有更好的方法可以做到这一点,或者我是如何做某事的特定错误?
答案 0 :(得分:1)
我认为这是因为如果您提供上下文,则不会执行具有动态段的Route中的model
挂钩。但是,在这种情况下,model
会返回一个承诺哈希,而在GroupsController
中,您会为其提供一个群组模型。因此,当您在model.group
中致电setupController
时,它会在您的群组模型上获得属性group
。因此它无法正常工作。所以不要做
this.transitionToRoute('members', group);
试
this.transitionToRoute('members', Ember.RSVP.hash({
group: group,
members: group.members
}));