2015-02-13 4 views
6

Ein gängiges Szenario, mit dem viele andere Entwickler konfrontiert sind - wir haben eine ausgereifte Anwendung basierend auf Symfony2/TWIG, und einige der html.twig-Vorlagen wurden zu sehr mit jQuery-Code und schwer zu pflegen. Was ist mit jQuery wegwerfen und Angular verwenden? Vorausgesetzt, ich habe ein Grundwissen über Winkelmodule, Controller, Dienste und Umfang und ein tiefes Wissen über Symfony2/TWIG, ist mein erstes Problem - was ist der beste Weg, um Variablen aus meinen vorhandenen Controller/Zweig-Vorlagen an Winkelsteuerungen zu übergeben ?Die beste Methode, um Variablen von Symfony2 an den Angular-Bereich zu übergeben

Ich möchte Scope nicht durch separaten JSON-Aufruf und einen separaten Controller in Symfony2 laden. Ich möchte nur die vorhandenen Variablen verwenden, die ich im Zweig habe.

Eine Möglichkeit, einige globale js Variablen zu tun ist, zu erklären:

<script> 
var window.someVar = {{ twig_object | json_encode() }}; 
</script> 

ein dann wie

<div ng-controller="myCtrl" ng-init="init()"> 
<div ng-model="someVar"> .... </div> 
</div> 

und Controller für

app.controller('myCtrl', ['$scope', function($scope) { 
$scope.init = function() { 
    if (window['someVar']) { 
     $scope['someVar'] = window['someVar']; 
    } 
}; 

Aber das scheint zu hässlich smth tun Ich (3 Schritte) Darf es zumindest vereinfacht oder anders gemacht werden?

+0

Meine eigene Erfahrung ist, dass Sie ständig sein werden kämpft AngularJS. Für mich war es einfacher, einen _format = json Parameter zu meinen Routen hinzuzufügen und dann einfach json vom Controller zurückzugeben. Halten Sie AngularJS glücklich und aus dem Bild. Außerdem müssen Sie nicht mit dem ganzen geschweiften Klammerproblem fertig werden. – Cerad

+0

@Cerad Ich bin sehr neugierig auf das Thema geschweifte Klammer. In MVC (die ich verwende) führen wir serverseitige Variablen mit einem at * @ * -Symbol ein, aber Sie verwenden die gleiche Syntaxclientseite hier (für die Interpolation), wie Sie serverseitig (für Variablen, die vom Server übergeben werden)! Probleme treten nicht von Zeit zu Zeit auf, oder ist es in Ordnung, weil der Server den Code zuerst sieht? – JMK

+0

@JMK - Ich verstehe deine Frage nicht. Ich vermeide das lockige Problem, indem ich twig- und angularjs-Vorlagen in separaten Dateien aufbewahre. Die Angularjs werden direkt ohne S2 angeboten. – Cerad

Antwort

7

Sie können Variablen direkt in ng-init erklären, so:

<div ng-controller="myCtrl" ng-init="myModel.someVar='{{ twig_object | json_encode() }}';"> 

Ich bin mehr an Razor in ASP.Net MVC, aber ich nehme an, das gleiche Prinzip, das hier mit Symfony2 gilt.

Denken Sie auch an die Doppelpunkt-Regel, Sie wollen nicht, dass der Wert direkt auf $ scope deklariert wird.

+0

Kannst du das letzte Wort erklären? Warum kann ich nicht schreiben ng-init = "someVar = '{{Zweig_Objekt | json_encode()}}';" und es wird $ scope.someVar mit twig_object initialisieren? Gemeint ist das Doppelpunkt-Prinzip. –

+0

Das Prinzip ist in Ordnung, aber der Code würde nicht funktionieren, siehe meine Antwort unten für den richtigen Code, um dies funktioniert –

4

Nun, Ihre Möglichkeiten sind in diesem Fall begrenzt. Wenn Sie keinen zusätzlichen Aufruf tätigen möchten, müssen Sie Daten als globale Variable in die Seite einfügen (@JMK gibt einen nützlicheren Weg mit ngInit). Es kann eine einfache Variable sein, aber ich finde es bequemer, sie in Form eines Objekts zu schreiben und einen konstanten Dienst aus diesem globalen Wert zu setzen. Danach kann diese Konstante in der gesamten App verwendet werden.

<script> 
window.config = {{ twig_object | json_encode() }}; 
</script> 

Erstellen Sie dann eine Konstante (oder value):

app.constant('config', {data: window.config}); 

und in Controller

app.controller('myCtrl', ['$scope', 'config', function($scope, config) { 
    $scope.init = function() { 
     $scope.someVar = config.someVar; 
    }; 
}]); 
+0

ist es möglich, $ scope.someVar ohne Aufruf von ng-init, wie vielleicht im Konstruktor des Controllers zu initialisieren? –

+0

Ja, es ist möglich, aber Sie müssen diese Daten irgendwie in Ihren Controller schreiben. Wenn sich Ihre App in der separaten js-Datei befindet, müssen Sie sie erneut in HTML als globale Variable oder als ng-init für ein Element schreiben. – dfsq

+0

klar, danke. Über Konstanten gelernt :) –

2

Eigentlich denke ich, das ist die einfachste Arbeitslösung:

<div ng-init='somevar = {{ somevar|raw|replace({"'":"\\'"}) }}'> 
+0

Dieser Code führt eine XSS-Sicherheitslücke durch die Variable somevar ein. –

Verwandte Themen