我正在构建一个列表视图,它在表中呈现记录列表。列表视图是作为可重用的mixin构建的,并且还具有可重用的模板。我希望列表视图尽可能易于使用,而不必编写太多代码,以使其工作 - 但只覆盖我想要更改的内容。
Idealy我只想告诉控制器(或者甚至更好)路由器,它将呈现一个列表视图,并且只渲染自定义模板,如果我有一个定义的。
示例:
import Ember from 'ember';
import MixinList from '../../mixins/mixin-list';
export default Ember.Route.extend(MixinList, {
model: function() {
return this.store.find('category');
}
});
目前我必须编写此代码,以使列表视图工作:
类别路线:
import Ember from 'ember';
export default Ember.Route.extend({
model: function() {
return this.store.find('category');
}
});
类别控制器:
import Ember from 'ember';
import MixinList from '../../mixins/mixin-list';
export default Ember.Controller.extend(MixinList, {
actions: {
itemAction: function(actionName, item) {
if (actionName === 'edit') {
this.transitionToRoute('categories.edit', item.get('id'));
}
}
}
});
类别模板:
<h1>Categories</h1>
{{partial 'mixin-list'}}
是否可以设置约定,因此使用特定mixin的路由会被赋予默认控制器和模板(如果它们没有被用户添加到项目中?)
答案 0 :(得分:0)
经过一些进一步的研究(以及一些新鲜的眼睛),我找到了解决方案:
import Ember from "ember";
export default Ember.Mixin.create({
renderTemplate: function() {
var currentController = this.container.lookup('controller:' + this.routeName);
if (currentController.isGenerated) {
currentController.reopen(MixinList);
this.render('mixin-list-view');
}
else {
this.render();
}
}
});
这允许我只定义路线,并包含mixin,并让mixin发挥魔力:
import Ember from 'ember';
import MixinList from '../../mixins/mixin-list';
export default Ember.Route.extend(MixinList, {
model: function() {
return this.store.find('category');
}
});
这里的重要部分是 renderTemplate 方法,以及对 currentController 的查找。 currentController 公开一个属性,告诉它是否自动生成(未由用户显式创建)。在这种情况下,我们可以覆盖渲染的模板,甚至可以向控制器添加功能 - 例如通过向控制器添加mixin(.reopen(...))。