gpt4 book ai didi

javascript - 从 Ember Addon 中注入(inject) Controller 操作

转载 作者:行者123 更新时间:2023-11-28 07:54:53 27 4
gpt4 key购买 nike

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

{{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 ,以便我不需要触摸消费应用程序的 Controller /路由?

我已经尝试过:

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

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

我可以在插件中以某种方式使用初始化程序将这两个操作注入(inject)到 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);

};
}
};

最佳答案

您似乎正在努力满足几乎自相矛盾的约束 - 这迫使您采用可能比违反约束更糟糕的解决方案。

限制是:(1) 组件不知道外界,但 (2) 插件作为一个整体与后端自主交互。

然后您的组件发出信号表示它想要完成某些操作,并且您希望您的附加组件提供默认的处理方式。

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

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

关于javascript - 从 Ember Addon 中注入(inject) Controller 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26219239/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com