IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AngularJS Discussion :

Plusieurs appels $http.jsonp


Sujet :

AngularJS

  1. #1
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut Plusieurs appels $http.jsonp
    Bonsoir,

    Je tatonne beaucoup avec Angular, et je n'arrive pas à faire plusieurs appel avec $http.jsonp.


    1. En fonction du remplissage d'un premier champ, j'appelle une url (avec la valeur de ce champ dans cette url), et je construit un champ <select> => OK
    2. j'aimerai, en fonction de ce que je selectionne, appeler une seconde url et récupérer la réponse.

    Mon probleme c'est que je n'arrive pas à récupérer ma seconde réponse. Il me met à la fin "....angular.callbacks._1 "

    J'ai codé un truc de ce style dans mon controleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    app.controller('MonControleur', ['$scope', '$http', function ($scope, $http) {
     
      $scope.checkSelectedChamp1 = function(element) {
            $scope.$apply(function($scope) {
     
    				$http.jsonp("http://url1/"+element.value+"/?callback=JSON_CALLBACK").
    				success(function(data) {
    					$scope.data = data;
    					// ici ça marche
    				}).
    				error(function (data) {
    				$scope.data = "Request failed";
     
    				});
     
            });
        };
      $scope.checkSelectedChamp2= function(element) {
    		$scope.$apply(function($scope) {
    		$http.jsonp("http://url2/"+element.value+"/?callback=JSON_CALLBACK").
    			success(function(data) {
    				$scope.data = data;
    				// ici ça marche pas
    			}).
    			error(function (data) {
    			$scope.data = "Request failed";
     
    			});
            });
        };
        }])
    Quelqu'un pourrait t'il m'expliquer et me dire la bonne méthode à appliquer ?

    merci

  2. #2
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Bonjour,

    Je ne comprends pas pourquoi tu appelle le $apply...
    pourquoi tu ne ferais pas ceci (avec un ng-change dans le template) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    app.controller('MonControleur', ['$scope', '$http', function ($scope, $http) { 
        $scope.checkSelectedChamp1 = function(element) {      
            $http.jsonp("http://url1/"+element.value+"/?callback=JSON_CALLBACK").
            success(function(data) {
                $scope.data = data;
                // ici ça marche
            }).
            error(function (data) {
                $scope.data = "Request failed";
            });        
        };
        $scope.checkSelectedChamp2= function(element) {
            $http.jsonp("http://url2/"+element.value+"/?callback=JSON_CALLBACK").
                success(function(data) {
                    $scope.data = data;
                    // ici ça marche pas
                }).
                error(function (data) {
                    $scope.data = "Request failed"; 
                });        
        };
    }])
    Comment est ton html ?

  3. #3
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    Merci pour ta réponse.

    Effectivement, le $apply n'est pas utile.

    J'ai corrigé et voila ce que ça donne.
    HTML
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
        <head>
            <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
            <title>test</title>        
        </head>
        <body ng-app="app">
    		<div ng-controller="DataCtrl">	
     
    		  <input ng-model='champ1' onchange="angular.element(this).scope().checkSelectedChamp1(this)"/> 
     
    			<pre ng-model="data">
    			 {{data}}
    			</pre>
    			<select ng-model='champ2Selected' onchange="angular.element(this).scope().checkSelectedChamp2(this)">
    				<option ng-repeat="item in liste" value="{{item.id}}">{{item.name}}</option>
    			</select>
     
     
    		</div>
     
    		<script type="text/javascript" src="bower_components/angular/angular.min.js"></script>
    		<script type="text/javascript" src="js/app.js"></script>
        </body>
    </html>

    javascript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    var modules = [];
    var app = angular.module('app', modules);
     
     
    app.controller('DataCtrl', ['$scope', '$http', function ($scope, $http) { 
        $scope.checkSelectedChamp1 = function(element) {      
            $http.jsonp("http://url1/"+element.value+"/?callback=JSON_CALLBACK").
            success(function(data) {
                $scope.data = data;
    			$scope.name = data.name;
    			$scope.liste = data.liste;
                // ici ça marche
            }).
            error(function (data) {
                $scope.data = "Request failed";
            });        
        };
        $scope.checkSelectedChamp2= function(element) {
            $http.jsonp("http://url2/"+element.value+"/?callback=JSON_CALLBACK").
                success(function(data) {
                    $scope.data = data;
                    // ici ça marche pas
                }).
                error(function (data) {
                    $scope.data = "Request failed"; 
                });        
        };
    }])

  4. #4
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Et quel est le résultat ?

    et dans le template (HTML), pour appeler une fonction définie dans le controleur, tu mets simplement le nom de la fonction.

    Remplace ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onchange="angular.element(this).scope().checkSelectedChamp2(this)"
    par cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ng-change="checkSelectedChamp2(champ2)"
    en initialisant peut-être champ2 dans le contrôleur.

    Idem pour l'autre fonction.

    PS: Ne pas oublier de remplacer onchange par ng-change

  5. #5
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    Si je remplace le onchange par ce que tu me donnes, j'ai l'erreur suivante :
    Uncaught SyntaxError: Unexpected token <
    Y a t'il un moyen simple de voir ou est ce qu'il considère que la structure est mauvaise ?

    Pour le problème du jsonp, lors de l'appel de la seconde url (qui est bonne) j'ai ceci dans la console de chrome :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    GET http://url2/4512154/?callback=angular.callbacks._1 
    f @ angular.js:10472
    b @ angular.js:10343
    m @ angular.js:10232
    $get.f @ angular.js:9944
    (anonymous function) @ angular.js:14454
    $get.m.$eval @ angular.js:15719
    $get.m.$digest @ angular.js:15530
    $get.m.$apply @ angular.js:15824
    (anonymous function) @ angular.js:27900
    c @ angular.js:3247
    ListPicker._handleMouseUp @ about:blank:632
    Qu'est ce que cela signifie ?

  6. #6
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    Je viens de voir ce qui n'allait pas :

    la seconde url est bonne mais j'avais écrit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $http.jsonp("http://url2/"+element.value+"/?callback=JSON_CALLBACK").
    alors qu'en modifiant en ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $http.jsonp("http://url2/"+element.value+"?callback=JSON_CALLBACK").
    ça passe.

    Si il y a une explication, je vux bien comprendre.

    Sinon, j'essai toujours de corriger mon onchange par un ng-change ...


    merci

  7. #7
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Citation Envoyé par pop_up Voir le message
    Y a t'il un moyen simple de voir ou est ce qu'il considère que la structure est mauvaise ?
    Si tu reçois un "unexpected token <", cela veut dire que tu demande au serveur un fichier js (par exemple), et qu'il te renvoie du html.
    Cela peut arriver par exemple quand il y a un "handler de fichier" au niveau du serveur et qu'il te renvoie une page 404 (404.html) quand il ne trouve pas le fichier demandé.
    Le premier caractère qu'il essaie donc de parser est "<" d'où le message.
    Il faudrait voir les xhr (F12) effectués.

    Pour ce qui concerne les paramètres dans tes url, c'est normal. Il ne faut pas mettre de "/" avant "?".

  8. #8
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    Merci pour vos réponses.

    L'appel à l'url se faisait bien et j'avais bien une réponse avec un statut 200, mais je n'avais pas de contenu.

    En tout cas tout marche bien, et j'ai réussi à remplacer mes fonctions javascript par du ng-change.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/01/2008, 11h59
  2. [z/OS] Plusieurs appels à un même sous-programme
    Par toomsounet dans le forum Cobol
    Réponses: 5
    Dernier message: 17/09/2007, 11h05
  3. src="" et double appel HTTP
    Par stefdefifoot dans le forum Apache
    Réponses: 1
    Dernier message: 20/01/2007, 11h08
  4. plusieurs connexions http
    Par abou_alkassim dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 01/12/2006, 14h24
  5. [AJAX] Effectuer plusieur appel ajax
    Par shwin dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 06/10/2005, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo