Ember 自定义约定
Ember custom conventions
我正在构建一个列表视图,它在 table 中呈现记录列表。列表视图被构建为可重用的 mixin,并且还有一个可重用的模板。我希望列表视图尽可能易于使用,而不必编写太多代码来使其工作 - 但只覆盖我想要更改的内容。
理想情况下,我只想告诉控制器(或者甚至更好)路由器,它将呈现一个列表视图,并且只呈现自定义模板,如果我已经定义的话。
示例:
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 的路由提供默认控制器和模板(如果用户未将它们添加到项目中)?
经过进一步的研究(和一些新鲜的眼光),我找到了解决方案:
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 公开了一个 属性,表明它是否是自动生成的(不是由用户明确创建的)。在这种情况下,我们可以覆盖呈现的模板,甚至可以向控制器添加功能 - 例如通过向控制器添加混合 (.reopen(...))。
我正在构建一个列表视图,它在 table 中呈现记录列表。列表视图被构建为可重用的 mixin,并且还有一个可重用的模板。我希望列表视图尽可能易于使用,而不必编写太多代码来使其工作 - 但只覆盖我想要更改的内容。
理想情况下,我只想告诉控制器(或者甚至更好)路由器,它将呈现一个列表视图,并且只呈现自定义模板,如果我已经定义的话。
示例:
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 的路由提供默认控制器和模板(如果用户未将它们添加到项目中)?
经过进一步的研究(和一些新鲜的眼光),我找到了解决方案:
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 公开了一个 属性,表明它是否是自动生成的(不是由用户明确创建的)。在这种情况下,我们可以覆盖呈现的模板,甚至可以向控制器添加功能 - 例如通过向控制器添加混合 (.reopen(...))。