6
votes

Meilleure façon de passer des variables de symfony2 à la portée angulaire

En tant que scénario commun que de nombreux autres développeurs sont confrontés - nous avons une application mature basée sur Symfony2 / Twig, et certains des modèles HTML.TWIG ont été trop surchargés avec le code JQuery et difficiles à entretenir. Qu'en est-il de jeter jQuery et d'utiliser angulaire? À condition que j'ai des connaissances de base sur les modules angulaires, les contrôleurs, les services et la portée, et une connaissance approfondie de symfony2 / brindille, mon problème de poing est - Quelle est la meilleure façon de passer des variables de mes contrôleurs existants / de mes modèles de contrôleurs existants et angulaires Contrôleurs?

Je ne veux pas charger la portée via un appel JSON séparé et un contrôleur séparé dans Symfony2. Je veux juste utiliser des variables existantes que j'ai dans brindille.

Un moyen de faire est de déclarer certaines variables JS globales: xxx

an, alors do < / p> xxx

et dans le contrôleur xxx

mais cela semble trop moche pour moi (3 étapes) Peut-il être simplifié au moins ou fait d'une autre manière?


4 commentaires

Ma propre expérience est que vous allez constamment combattre angularjs. Pour moi, cela a fini par être plus facile d'ajouter un paramètre _Format = JSON à mes itinéraires, puis de retourner JSON à partir du contrôleur. Gardez les angularjs heureux et branche de la photo. De plus, vous n'aurez pas à gérer tout le problème des accolades bouclés.


@Céry, je suis très curieux de la question de la corde bouclée. En MVC (que j'utilise), nous introduisons des variables latérales du serveur avec un symbole @ , mais vous utilisez le même côté client de syntaxe ici (pour l'interpolation) au fur et à mesure que vous faites du côté serveur (pour les variables étant transmises de le serveur)! Vous n'avez pas de temps en temps dans des problèmes de temps en temps, ou est-ce que le serveur voit le code en premier?


@Jmk - Je ne comprends pas votre question. J'évite le problème bouclé en gardant des modèles de brindilles et d'angularjs dans des fichiers séparés. Les angularjs sont servis directement sans passer par S2 du tout.


@Jmk - semble qu'il n'y ait aucune question de Brace bouclée. J'utilise habituellement $ fournisseur d'interpolateur dans mes modules, à utiliser [[]] pour angular et laissez {{}} pour brinder. Ou je suis en train de superviser le smth?


3 Réponses :


7
votes

Vous pouvez déclarer des variables directement dans ng-init, donc: xxx

je suis plus utilisé pour rasoir dans asp.net mvc mais je suppose que le même principe s'applique ici avec symfony2. < / p>

N'oubliez pas la règle de double point, vous ne voulez pas que la valeur déclarée directement sur $ de portée.


2 commentaires

Pourriez-vous expliquer la dernière phrase? Pourquoi je ne peux pas écrire ng-init = "quelquevar = '{{Twig_Object | JSON_ENCODE ()}}';" Et cela initialisera $ périmètre.Somevar avec Twig_Object? Signifie le principe de double point.


Le principe va bien, mais le code ne fonctionnerait pas, voir ma réponse ci-dessous pour le code correct pour obtenir ce travail



4
votes

Eh bien, vos options sont limitées dans ce cas. Si vous ne voulez pas faire appel supplémentaire, vous devrez injecter des données dans la page en tant que variable globale (@JMK donne un moyen de plus utile avec nginit code>). Cela peut être une variable simple, mais je trouve plus pratique de l'écrire sous la forme d'un objet et de définir un service constant de cette valeur globale. Après cela, cette constante peut être utilisée dans l'application.

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


2 commentaires

Est-il possible d'initialiser $ périmètre.somevar sans appeler ng-init, comme peut-être dans le constructeur du contrôleur?


Oui, c'est possible, mais vous avez toujours besoin d'une manière ou d'une autre pour écrire ces données dans votre contrôleur. Si votre application est à l'intérieur du fichier JS séparé, vous devez l'écrire en HTML en tant que variable globale ou en tant que ng-init sur certains éléments.



2
votes

En fait, je pense que c'est la solution de travail la plus facile: xxx


1 commentaires

Ce code introduit la vulnérabilité XSS thrugh through la variable quelqueevar.