1

假设我有一个带有播放组件的独立插件:

{{my-record play="recordPlay" stop="recordStop"}}

/app/components/my-record.js

import Ember from 'ember';

export default Ember.Component.extend({
  actions: {
    play: function() {
      this.sendAction('play');
    },
    stop: function() {
      this.sendAction('stop');
    }
  }
});

我希望插件与后端独立工作并在内部处理所有操作。如何从插件本身处理这两个操作recordPlayrecordStop以便我不需要触摸使用应用程序的控制器/路由?

我努力了:

  • 在插件中创建应用程序控制器,例如。`/app/controllers/application.js - 这永远不会被调用

  • 在插件中创建应用程序路由,例如。`/app/routes/application.js - 除非使用应用程序有自己的 ApplicationRoute 覆盖插件的路由,否则会调用它

我可以在插件中以某种方式使用初始化程序将这两个操作注入 ApplicationController 吗?

编辑:使用 ApplicationRoute._actions 的肮脏解决方法

/app/initializers/record.js

export default {
  name: 'record',

  initialize: function(container, app) {

    var applicationRoute = container.lookup('route:application');

    applicationRoute._actions.recordPlay = function(id) {

        console.log('CALLED recordPlay', id);
    };

    applicationRoute._actions.recordStop = function(id) {

        console.log('CALLED recordStop', id);

    };
  }
};
4

1 回答 1

0

似乎您正在努力满足几乎相互矛盾的约束——这迫使您进入一个可能比违反约束更糟糕的解决方案。

约束是:(1)组件不知道外部世界,但(2)附加组件作为一个整体与后端自主交互。

然后你的组件发出信号,它想要完成某些事情,并且你希望你的插件提供一种默认的做事方式。

组件不知道外部世界的想法是,它们可以在不同的上下文中使用。在插件之外使用组件是否现实?似乎您希望融入“默认的做事方式”。

您可以妥协的一种方法是使用蓝图将适配器注入到您的组件中。然后适配器将与商店交互(等等?)。但是,如果消费者想要以不同的方式做事,他们不能定义适配器并改为定义操作,或者使用不同的适配器。

于 2015-01-20T06:43:55.180 回答