我有基本模板(base.html.twig),其中包含动态生成的 js 链接:
<script type="text/javascript">
<script type="text/javascript" src="{{ path('renderJs') }}"></script>
</script>
以及呈现此 JS 的 Action:
/**
* @Route("/scripts.js",
* name="renderJs")
*/
public function renderJsAction(Request $request)
{
return new Response(
$this->renderView(
"AcmeBundle:Default:renderJs.js.twig",
array('foo' => 'bar')
),
200,
array('Content-Type' => 'text/javascript')
);
}
但我希望渲染 JS 具有与基本模板相同的 Twig 上下文(在 renderJs.js.twig 中具有与 base.html.twig 中相同的变量)。 那可能吗?有什么想法可以解决这个问题吗?
最佳答案
这就是一切的运作方式(据我所知):
- base.html.twig 进行渲染,将 renderJS 操作路由的 URL 放入脚本标记的源中
- 用户浏览器加载生成的页面,并在脚本标记中查找 renderJS 操作的 URL,然后向服务器发出另一个请求以获取该 URL。
因此,在这种情况下有两个请求:一个请求获取 base.html.twig 渲染,另一个请求获取 renderJS URL 提供的脚本文件。当服务器收到第二个请求时,第一个请求的上下文就消失了。
我可以想到两个选择。选项 1 是重新生成上下文(理想情况下通过设置一些类或方法来在两个地方执行此操作)。如果您想对 javascript 文件进行第二次请求(例如它是否可以缓存)并且生成上下文不是非常消耗资源,那么这很好。
选项 2 是跳过该操作的需要,并将 render.js.twig 模板作为内联 JavaScript 包含在 base.html.twig 模板中。如果创建上下文的成本确实很高并且 javascript 很轻且永远不会被缓存,那么这可能只是一个好主意(但最好让文件尽可能多地缓存)。
让我知道它们听起来如何以及它们如何适用于您,我可以深入了解更多细节。
关于javascript - [交响乐+ Twig ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41168447/