我有一个dijit小部件,相对于dojo根位于以下位置:
/modules/components/myWidget/template/MyWidget.html
现在,除了这个模板,我还有一个需要包含在模板中的图像文件:
/modules/components/myWidget/template/myImage.png
现在,在我的模板文字中:
<img src="./myImage.png" />
但是,这相对于应用程序根目录(也不是dojo的根目录,也不是模板位置)。
如何才能让我的模板直接解析到它的位置?
答案 0 :(得分:2)
好吧,我会做以下事情,为图像添加一个附加点,例如:
<img src="" data-dojo-attach-point="imageNode" />
然后在您的JavaScript代码中(例如在您的小部件的postCreate
函数中),我将执行以下操作:
declare([...], {
postCreate: function() {
this.imageNode.src = require.toUrl("./template/myImage.png");
}
}
使用require.toUrl
,您实际上会获得URL,如果您希望将其作为模块加载,则会使用该URL。这意味着:
require.toUrl("./template/myImage.png");
指的是当前模块路径(./
),可能是/modules/components/myWidget
,然后是template/myImage.png
。
答案 1 :(得分:1)
我有一个类似的问题,我需要一个相对路径到我的dojo/text
模板。例如
/foo
/js
/stuff
SomeWidget.js
/templates
/MyTemplateForSomeWidget.html
事实证明你应该给出一个&#34;模块路径&#34;不是一个愚蠢的网址&#34;,因此赢了工作:
"dojo/text!../../templates/MyTemplateForSomeWidget.html"
它为您提供了很大的错误IrrationalPath
(没有解释)。原来你不允许使用&#34; ../
&#34;,所以它吓坏了。你当然可以使用绝对路径,从/
开始,但在我的情况下,整个路径都没有保证,所以我通过在dojoConfig
中注册路径解决了这个问题。 ,就像这样
dojoConfig = {
// ...
packages: [
{ name: 'app', location: '/foo/js/app' },
{ name: 'templatePkg', location: '/foo/templates/' },
// ... etc
}
}
然后只需将templatePkg
作为模板路径的开头,如下所示:
"dojo/text!templatePkg/MyTemplateForSomeWidget.html"
&#34;艰难的部分&#34;对我来说,我想到了一个&#34;包装&#34;必须是JavaScript源代码,并认为其他人可能有同样的误解。
希望这会有所帮助。 -G。
答案 2 :(得分:0)
require
方法像模块一样require.ToUrl("./relative/path")
下一个例子来自工作中的生产代码,我已经删除了额外的东西。我们假装文件是app/widget/thingy.js
:
define([
"require" // Needed for relative require.toUrl() calls
/* stuff */
], function(require /*stuff*/){
var blankImage = require.toUrl("../resources/transparent.gif");
/* stuff */
});
运行时,blankImage
值应为"app/resources/transparent.gif"
。
此外,如果您使用的是Dijits和_WidgetBase
,则还应考虑将require
值分配到contextRequire
属性中。这将允许您在HTML模板中执行以下操作:
<div data-dojo-type="./SiblingWidget"></div>