2012-09-24 4 views
13

Cosa devo fare per ottenere twig per elaborare un file JavaScript? Ho un html.twig che utilizza un ramoscello JavaScript. Qualcosa di simile a questo:Symfony2, ramoscello e JavaScript

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

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

< more template omitted > 

e parti di main.js.twig:

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

e il controller:

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

mi aspettavo che il JavaScript a guardare come questo a run-time :

alert('Hello World'); 

Ma, th Il codice è invariato. Qualche idea su cosa sto facendo male?

Grazie, Scott

risposta

12

Assetic non include i modelli ramoscello; dovresti creare un controller separato per il file javascript. Anche se lo considererei una cattiva pratica dal punto di vista delle prestazioni, perché dovrai elaborare due richieste in questo modo.

/** 
* @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 %} 

Un'alternativa è quella di scaricare variabili dinamiche in HTML, e utilizzare solo i file javascript statici.

1

Invece, quello che ho fatto è questo nei main.js:

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

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

e, nei rami sottoclasse, abbiamo questa main.js:

function getStringFromSubClass(){ 
    return "baseClassString"; 
    } 

E questo ramoscello:

{% 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 %} 

Un pò buffo, ma funziona.

Scott

17

mio sugestion di utilizzare le variabili globali:

{% 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 %} 

quindi è possibile utilizzare nel vostro js del file:

alert(TWIG.variableTwo); 
+0

Questo è perfetto per ciò di cui ho bisogno, percorsi generati per l'utilizzo in query Ajax. –

+3

Forse usando 'var TWIG = TWIG || {}; ', soprattutto quando hai intenzione di usarlo due volte. – jeroenvisser101

+0

@LaytonEverson Il [FosJsRoutingBundle] (https://github.com/FriendsOfSymfony/FOSJsRoutingBundle) può aiutarti con questo – MauganRa

-1

voglio usare

<!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> 

in TWI G

+0

Questa è una risposta? –

+0

Questa non è una risposta. È solo una dichiarazione che può o non può essere la sua domanda. – innerurge1