2012-09-24 132 views
13

我需要做些什么才能让树枝处理JavaScript文件?我有一个使用JavaScript分支的html.twig。事情是这样的:Symfony2,树枝和JavaScript

{% extends 'BaseBundle::layout.html.twig' %} 

{% block javascripts %} 
    {{ parent() }} 
    {% javascripts 
     '@BaseBundle/Resources/js/main.js.twig' 
    %} 
    {% endjavascripts %} 
{% endblock %} 

< more template omitted > 

及零部件main.js.twig的:

function testFunction() 
{ 
    alert('{{VariableFromPHP}}'); 
} 

而且控制器:

/** 
* @Route("/",name="home") 
* @Template("MyBundle:Default:index.html.twig") 
*/ 
public function indexAction() 
{ 
    return array('VariableFromPHP' => 'Hello World'); 
} 

我预期的JavaScript看起来像这样在运行时:

alert('Hello World'); 

但是,th e代码不变。任何想法我做错了什么?

感谢, 斯科特

回答

12

Assetic不包括树枝模板;你应该为javascript文件创建一个单独的控制器。虽然我会认为这是不好的练习,因为你必须以这种方式处理两个请求。

/** 
* @Route("/main.js") 
*/ 
public function mainJsAction() { 
    $params = array('test' => 'ok'); 
    $rendered = $this->renderView('MyBundle:Default:main.js.twig', $params); 
    $response = new \Symfony\Component\HttpFoundation\Response($rendered); 
    $response->headers->set('Content-Type', 'text/javascript'); 
    return $response; 
} 
{% extends 'BaseBundle::layout.html.twig' %} 

{% block javascripts %} 
    {{ parent() }} 
    <script type="text/javascript" src="{{ path('my_default_mainjs') }}"></script> 
{% endblock %} 

另一种方法是倾倒在html动态变量,并且只使用静态JavaScript文件。

1

相反,我所做的这是在main.js:

function doGetStringFromSubClass() 
{ 
    if (typeof getStringFromSubClass == 'function') 
    { 
     return getStringFromSubClass(); 
    } 
    else 
    { 
     alert('getStringFromSubClass() needs to be defined.') 
    } 
} 

function testFunction() 
{ 
    alert(doGetStringFromSubClass()); 
} 

,并在子类树枝,我们有这个main.js:

function getStringFromSubClass(){ 
    return "baseClassString"; 
    } 

这枝:

{% extends 'BaseBundle:Default:index.html.twig' %} 

{% block javascripts %} 
    {{ parent() }} 

    {% javascripts 
     '@SomeSubclassBundle/Resources/js/main.js' 
    %} 

    <script type="text/javascript" src="{{ asset_url }}"></script> 
    {% endjavascripts %} 
{% endblock %} 

有点高飞,但它工作。

斯科特

17

我sugestion使用全局变量:

alert(TWIG.variableTwo); 
+0

这非常适合我所需要的,用于在Ajax查询中生成的路由。 –

+3

可能使用'var TWIG = TWIG || {};',特别是当你计划使用这两次。 – jeroenvisser101

+0

@LaytonEverson [FosJsRoutingBundle](https://github.com/FriendsOfSymfony/FOSJsRoutingBundle)可以帮助你, – MauganRa

-1

我想用

<!DOCTYPE html> 
<html> 
<body> 

<p>A function is triggered when the user releases a key in the input field. The function outputs the actual key/letter that was released inside the text field.</p> 

Enter your name: <input type="text" id="fname" onkeyup="myFunction()"> 

<p>My name is: <span id="demo"></span></p> 

<script> 
function myFunction() { 
    var x = document.getElementById("fname").value; 
    document.getElementById("demo").innerHTML = x; 
} 
</script> 

</body> 
</html> 

{% javascripts '@AcmeBundle/Resources/public/js/*' output='js/compiled/main.js'%} 
     <script> 
      var TWIG = {}; 
      TWIG.variableOne = "{{ path('rote_to_nowhere') }}"; 
      TWIG.variableTwo = "{{ helloworldVar }}"; 
      TWIG.variableThree = "{{ "something"|trans }}"; 
     </script> 
     <script type="text/javascript" src="{{ asset_url }}"></script> 
{% endjavascripts %} 

那么您可以在您的js文件中使用它TWI中的

G

+0

这是一个答案? –

+0

这不是一个答案。这只是一个声明,可能是也可能不是它自己的问题。 – innerurge1