2016-12-15 117 views
1

我有链路基本模板(base.html.twig)动态生成的js:[Symfony的+嫩枝]

<script type="text/javascript"> 
 
    <script type="text/javascript" src="{{ path('renderJs') }}"></script> 
 
</script>

和行动这使得这个JS:

/** 
    * @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') 
     ); 
    } 

但我想要使用与基本模板中相同的Twig上下文来渲染JS(在base.html.twig中在renderJs.js.twig中具有相同的变量)。 这可能吗?任何想法如何处理这个问题?

+0

是'renderJs.js.twig'扩展'base.html.twig'吗? – rrubiorr81

回答

0

这是怎么了一切的工作(据我所知):

  1. base.html.twig渲染,把一个URL的renderJS行动路线到源脚本标记
  2. A的用户浏览器加载生成的页面,并在脚本标记中查找renderJS操作的URL,然后向服务器发出另一个请求以获取该页面。

因此,在这种情况下有两个请求:一个获取base.html.twig渲染,然后另一个获取renderJS URL提供的脚本文件。当服务器获得第二个请求时,第一个请求的上下文已经消失。

我可以考虑两种选择。选项1是重新生成上下文(理想情况是通过设置一些类或方法在两个地方执行)。如果你想要第二个javascript文件的请求(比如它可以被缓存)并且生成上下文不是非常耗费资源,那么这很好。

选项2将跳过对动作的需求,并将inline javascript中的render.js.twig模板包含在base.html.twig模板中。这可能只是一个好主意,如果上下文的创建非常昂贵,并且JavaScript很轻而且永远不会被缓存(但最好让文件尽可能缓存)。

让我知道他们的声音以及它们如何适用于您,我可以深入了解更多细节。

+0

是的我已经考虑过这两个选项,但我想知道它是否是另一个选项。 –

+0

1)重新生成上下文可能会花费太多时间,所以第二个选项会更好,但: 2)有很多行脚本,它将以这种方式工作,但在源代码预览中看起来不太好 –

+0

如何使用某些东西像redis或memcached?只要所有东西都加载了(我正在考虑延迟加载Doctrine是一个问题),您可以在短时间内存储上下文,并在javascript请求进入时检查它。 – skagzilla