Rails引擎:使主机应用程序javascript可用于Mounted Engine

Rails Engines: Make host app javascript available to Mounted Engine

本文关键字:用于 Mounted Engine javascript 应用程序 引擎 主机 Rails      更新时间:2023-09-26

下面是我尝试做的事情的快速可视化:

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