Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Grails资产管道插件从Javascript访问图像?_Javascript_Grails_Asset Pipeline - Fatal编程技术网

如何使用Grails资产管道插件从Javascript访问图像?

如何使用Grails资产管道插件从Javascript访问图像?,javascript,grails,asset-pipeline,Javascript,Grails,Asset Pipeline,我刚刚升级到Grails2.4,正在使用Asset-Pipeline1.8.7插件。我想知道如何从Javascript访问图像。我正在使用Google Maps Javascript V3 API,需要在Javascript中设置一些标记图标。有没有办法使用标记在GSP上创建一些Javascript变量,然后在my app.js代码中访问该文件?如果不可能,如何在资源中引用已编译的映像 我不知道您的理想解决方案是什么,但解决方案可能是: 在js代码中使用相对路径,如“../assets/Use

我刚刚升级到Grails2.4,正在使用Asset-Pipeline1.8.7插件。我想知道如何从Javascript访问图像。我正在使用Google Maps Javascript V3 API,需要在Javascript中设置一些标记图标。有没有办法使用标记在GSP上创建一些Javascript变量,然后在my app.js代码中访问该文件?如果不可能,如何在资源中引用已编译的映像

我不知道您的理想解决方案是什么,但解决方案可能是:

  • 在js代码中使用相对路径,如“../assets/Use control.png”
  • 在dom中添加img并从js代码中引用它
  • 在dom中的适当元素上添加
    data imgpath=“${asset.assetPath(src:'use control.png')}”
    属性,并使用此链接

  • 是的,您可以在gsp中放置一个
    ${assetPath(src:'img.png')}
    ,您可以定义一个全局可用的对象,该对象保存资产目录的根路径,并使用它来构建资产的URL。 将此代码段添加到布局标题部分

    <g:javascript>
        window.grailsSupport = {
            assetsRoot : '${ raw(asset.assetPath(src: '')) }'
        };
    </g:javascript>
    
    
    window.grailsSupport={
    AssetRoot:“${raw(asset.assetPath(src:”)}”
    };
    
    然后像这样在其他地方使用它:

    <g:javascript>
        var pathToMyImg = window.grailsSupport.assetsRoot + 'images/google_maps_marker.png';
    </g:javascript>
    
    
    var pathToMyImg=window.grailsSupport.assetroot+'images/google_maps_marker.png';
    
    更新2015-08-06

    在查看的发行说明中,我注意到资产的非摘要版本不再存储在WAR文件中。这意味着,当应用程序部署为WAR时,我建议的解决方案会中断:

    2015年5月31日 2.2.3版本-不再在war文件中存储非摘要版本,将开销减少一半。还删除了Commons i/o依赖项。更快的字节流

    这意味着您必须事先明确定义所有图像,并且不再能够在脚本中动态构建路径:

    <g:javascript>
        window.grailsSupport = {
            myImage1 : '${assetPath(src: 'myImage1.jpg')}',
            myImage2 : '${assetPath(src: 'myImage2.jpg')}'
        };
    </g:javascript>    
    
    
    window.grailsSupport={
    myImage1:“${assetPath(src:'myImage1.jpg')}”,
    myImage2:“${assetPath(src:'myImage2.jpg')}”
    };
    
    更新2016-05-25

    现在可以通过设置
    grails.assets.skipNonDigests
    (默认值为
    false
    ),配置构建的war文件中是否包含资产的非摘要版本:

    通常不需要关闭“SkipOnDigests”。Tomcat仍将自动按非摘要名称提供文件,并将使用storagePath通过
    manifest.properties
    别名映射将其复制出去。这只会将存储量减少一半。但是,如果您试图在cdn资产管道插件之外通过“target/assets”的内容上传到cdn。这可能仍然有用


    请注意,您仍然可以使用建议的解决方案预先定义所有必需的图像,以解决浏览器中的缓存问题(因为资产的摘要版本在文件名中有其内容哈希)。

    作为替代方案,您可以使用HTML5的data-*属性。
    我在这里进一步解释:

    您是否在javascripts中使用过资源插件taglib?或者类似于
    ${resource(dir:,file:)}
    ?我使用了Resources插件,但找不到访问app.js文件中图像位置的方法?对于Grails2.4,我使用的是资产管道管理器,但问题是相同的。我看到了一个例子,他们使用g:javascript标记在GSP中声明了一个JS变量,但是我的app.JS仍然无法引用这个变量。使用资源插件taglib和资源方法(这是本机grails方法,而不是来自插件),您的根从WEB-APPS开始。使用资产管道插件taglib和assetPath方法,根目录从grails app/assets开始。看看我下面的例子。该文件位于文件夹
    /grails-app/assets/stylesheets/style.css
    中,我在代码中使用它:
    assetPath(src:“stylesheets/style.css”)
    或作为视图中的标记:
    与资源相同此答案有效,我无法投票,因为我没有足够的信誉点。我也喜欢这个答案,但是我不能投票,因为我也没有足够的声望点数。好答案,但我没有足够的声望点数来投票。到目前为止,这是最简单和最直接的答案。@davydotcom,我如何在javascript文件和样式表文件上使用${assetPath(src:'img.png')}?我使用的是grails:assets:url:storagePath:/opt/domain/assets/