我使用AngularJS获得了一个带有大量JavaScript和模板文件的django应用程序。
在我的django模板中,我可以使用{% static %}
标记正确引用这些文件,如下所示:
<script src="{% static "angular/myapp.app.js" %}"></script>
但是,外部文件本身显然是do not get resolved through django's templating framework,所以这不是一个选项。所以人们最常做的就是对那里的静态路径进行硬编码:
$routeProvider.when('/', {
// this works but is not ideal
templateUrl: '/static/pages/some-angular-template.html',
})
我已经看到了将STATIC_URL
加载到某个地方的javascript并使用它来构造引用的建议。像这样:
Django模板:
var STATIC_URL = {{ STATIC_URL }};
function getStaticUrl(templatePath) {
return STATIC_URL + templatePath;
}
外部JS :
$routeProvider.when('/', {
templateUrl: getStaticUrl('/pages/some-angular-template.html'),
})
这有点好,但仍然不完美,因为它只处理基本路径。如果您想使用ManifestStaticFilesStorage
(我这样做),那么您仍然无法正确解析该文件。
这个问题有什么好的解决方案吗?我正在考虑的选项:
data
标记将网址存储在一些隐藏的HTML标记中(再次通过django模板)只是想知道是否有解决此问题的标准做法或图书馆?我已多次遇到这个问题,但从未找到过令人满意的解决方案。
答案 0 :(得分:2)
我目前的解决方案(如果不是最优雅的话,效果很好)只是在django模板中创建一个庞大的全局常量字典,然后直接在JS中引用它们。
Django模板:
<script type="text/javascript">
NG_STATIC_FILES = {
"HOME": "{% static '/pages/home.html' %}",
"SOMETHING_ELSE": "{% static '/pages/some-angular-template.html' %}",
};
</script>
外部JS :
$routeProvider.when('/', {
templateUrl: NG_STATIC_FILES.SOMETHING_ELSE,
})
等
答案 1 :(得分:1)
使用您的 getStaticUrl
函数,但还要附加一个查询字符串,例如 ?v=abc
,其中 abc
对于您的应用程序的每个部署版本都是唯一的,以破坏缓存。 (例如,您的 html 定义了 window.ASSET_VERSION = 'abc'
,当您部署应用的新版本时,您的 html 定义了 window.ASSET_VERSION = 'xyz'
。)
优点:
缺点:
类似于“创建 API 以获取 URL”:将包含 URL 的字典放入静态 json 文件中,并使您的 getStaticUrl
函数在获取 json 文件后返回解析为请求的 url 的 Promise .在 json 文件名或缓存破坏查询字符串中放置版本 ID(见上文),以便缓存 json 文件。
优点:
缺点: