Ember定制约定

时间:2015-02-17 07:53:23

标签: ember.js

我正在构建一个列表视图,它在表中呈现记录列表。列表视图是作为可重用的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的路由会被赋予默认控制器和模板(如果它们没有被用户添加到项目中?)

1 个答案:

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