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(...))。