Rails 引擎:使主机应用程序 javascript 可用于已安装的引擎

Rails Engines: Make host app javascript available to Mounted Engine

下面是我正在尝试做的事情的快速视图:

var hostAppJs = {
    callMe: function(){
        alert("CALL ME FROM MAIN APP ");
    }
}

var hookedInEngineJs = {
    init: function(){
        $('button').on('click', function(){
            hostAppJs.callMe();
        });         
    }
}
hookedInEngineJs.init();

基本上,我希望所有主机应用程序的 javascript 都可用于安装的引擎。当 javascript 为我安装的引擎全部连接在一起时,它应该看起来像在上面,即使 hostAppJs javascript 对象仅存在于主机应用程序中,并且 hookedInEngineJs javascript对象只存在于安装的引擎中。

我 运行 遇到的问题是,当我在安装的引擎中时,它找不到 hostAppJs 对象,所以它似乎没有被正确加载安装的发动机。

这是我的 application.js 主机应用文件:

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .

这是我安装的引擎的 application.js 文件:

//= require '/<absolutePathToHostApp>/assets/javascripts/application.js'
//= require_tree .

所以我假设对于我安装的引擎,来自主机应用程序的所有 javascript 都被加载并可供我的引擎使用,然后它加载它自己的所有 javascript .因此,我认为我的主机应用程序的 javascript 可用于我的引擎。遗憾的是,它不起作用。

感谢任何帮助,谢谢!

答案:在您的每个引擎中:如果您想加载主机应用程序的 javascript 文件,只需在引擎的 javascript 清单文件中添加此行:

//= require application.js

这是指宿主应用程序的 application.js 文件,而不是引擎。引擎的application.js文件是为了区分两者的命名空间:

例如:my_engine/application.js

将主机应用程序 css 加载到每个引擎的 css 中也是如此。只需将此行放在引擎的清单文件中,即可使主机应用程序的 css 对您的引擎可用:

*= require application.css