2012-09-24 164 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