Ember DRY嵌套具有相同操作的组件

时间:2015-07-27 19:55:53

标签: ember.js ember-cli ember-router ember-components

现在我正在我的ember应用程序中构建一个特定的屏幕 具有未知数量的嵌套组件。因此我不敢尝试 根据显示的组件更改URL也有一些基本信息 我希望在每个子屏幕上显示。

目前,当真正的动作逻辑仅在路由上定义时,似乎我必须重新定义并传递所有这些动作名称。有办法吗? 可能在控制器或一个父母"中干掉这些动作参考。成分

这是一个示例性的旋转旋转,我将这些组件渲染到插座http://ember-twiddle.com/31a69c62ceddcb69b02b

这是路线的一个例子

import Ember from 'ember';

export default Ember.Route.extend({
  _fixtureModels: [
    { person: {name: 'bill'}, sideModel: null},
    { person: {name: 'bill'}, sideModel: { postName: 'test post' }},
    { person: {name: 'bill'}, sideModel: { commentName: 'test comment'}}
    ],

  _renderSideModel: function (template, sideModel) {
    this.render();

    this.render(template, {
      outlet: 'side-model',
      into: 'index',
      model: sideModel
    });
  },

  renderTemplate: function () {
    this.render();

   this.render('someComponentWrapper', {
     outlet: 'side-model',
     into: 'index'
   });
  },

  model: function () {
     return this._fixtureModels[0];
  },

  actions: {
    renderTopLevel: function () {
      return this.renderTemplate();
    },
    renderPost: function () {
      return this._renderSideModel('post', this._fixtureModels[1]);
    },
    renderComment: function () {
      return this._renderSideModel('comment', this._fixtureModels[2]);
    }
  }
});

我知道URL应该是Ember中的王者,这很有罪但重建一个潜在的嵌套视图会非常困难。

1 个答案:

答案 0 :(得分:0)

因此,您必须重新定义所有这些操作名称的原因是因为组件被设计为隔离的,即在任何地方重用。但是,您可以使用两个快捷方式:

  1. 应用默认操作名称:
  2. 您可以在组件中使用默认操作名称,以避免在每个模板中指定它。

    // components/some-component.js
    
    export default Ember.Component.extend({
        renderPost: "renderPost",
        renderComment: "renderComment"
    });
    
    // some template where you are using this component
    
    {{some-component-wrapper renderPost="myRenderPost"}}
    {{!overrides renderPost, but "inherits" an action named renderComment}}
    
    1. 使用关闭操作(如果您使用的是Ember 1.13或更高版本):
    2. 请参阅http://emberjs.com/blog/2015/06/12/ember-1-13-0-released.html#toc_closure-actions

      这是一项新功能,可让您向下传递功能而不是动作名称。