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 :

Mon script ne retourne que la dernière valeur des infos censées être transmises


Sujet :

AngularJS

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut Mon script ne retourne que la dernière valeur des infos censées être transmises
    Bonsoir, à nouveau moi !

    J'ai essayé une seconde méthode pour consommer mes webService SOAP. J'ai utilisé la librairie soapclient.js et angular.soap.js

    En suivant un tuto relativement simple, j'ai réussi à appelé mon fichier WSDL et a utiliser ma fonction déclarée dans celle ci (voir script JS ci dessous).

    Au vu du chargement de la page, mon script charge toutes les données mais ne m'envoie uniquement le dernier row d'un supposé résultat de 20 rows.

    Je précise, mon webService SOAP fonctionne bien (testé par SOAPUI). De même, avec un console.log dans mon controller, il s'avère que mon navigateur ne charge que le dernier object.

    Je pense que cela vient de ma factory ? ou alors cela n'est pas sensé me retourné plusieurs rows...

    Html :
    http://pastebin.com/bMCbu6Rq

    Script angularJS :
    http://pastebin.com/zJfGwFx7


    Auriez-vous une piste pour résoudre ce soucis ? Je me trompe peut être à un endroit qui va vous paraître flagrant.


    Merci d'avoir pris le temps de me lire,

    Bonop

  2. #2
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 130
    Points
    9 130
    Par défaut
    tu peux pas utiliser le bbcode [CODE]?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Bonsoir,

    je ne connaissais pas, effectivement ça simplifie l'affichage :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <!DOCTYPE html>
    <html lang="fr" ng-app="myApp">
     
        <head>
            <meta charset="utf-8" />
            <title>Route App</title>        
     
    <!-- Les scripts sont bien appelés une fois le lancement de la Servlet -->
            <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script>
            <script src="js/controlerNavigation.js"></script>
            <script src="js/angular.js"></script>
            <script src="js/soapclient.js"></script>
            <script src="js/angular.soap.js"></script>
            <link rel="stylesheet" href="css/bootstrap.css">
            <link rel="stylesheet" href="css/style.css">
    <!--         <link rel="stylesheet" href="css/style.css"> -->
     
     
        </head>
     
        <body>    
            <div ng-controller="MainCtrl">     
                <table class="table" id="table">
                    <thead>
                        <tr class="ligneTab">                      
                            <th>Nom</th>                               
                        </tr>
                    </thead>
     
                    <tbody>                                            
                        <tr ng-repeat="data in myData">
                            <td>{{data.item}}</td>                     
                        </tr>                              
                    </tbody>
     
                </table>
                            <hr>
     
            </div> 
        </body>
    </html>
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    angular.module('angularSoap', [])
     
    .factory("$soap",['$q',function($q){
        return {
            post: function(url, action, params){
                var deferred = $q.defer();
     
                //Create SOAPClientParameters
                var soapParams = new SOAPClientParameters();
                for(var param in params){
                    soapParams.add(param, params[param]);
                }
     
                //Create Callback
                var soapCallback = function(e){
                    if(e.constructor.toString().indexOf("function Error()") != -1){
                        deferred.reject("An error has occurred.");
                    } else {
                        deferred.resolve(e);
                    }
                }
     
                SOAPClient.invoke(url, action, soapParams, true, soapCallback);
     
                return deferred.promise;
            }
        }
    }]);
     
     
     
    angular.module('myApp', ['angularSoap'])
     
    .factory("testService", ['$soap',function($soap){
        var base_url = "http://localhost/ws_ldap/InputServer.php";
     
        return {
            getExternalI: function(){
                return $soap.post(base_url, "getExternalI");           
            }
     
        }
    }])
     
    .controller('MainCtrl', function($scope, testService) {
     
      testService.getExternalI().then(function(response){
     
        $scope.myData = response;
        console.log(response);
      });
     
    })

    Désolé d'avoir pris autant de temps à répondre, je n'ai pas eu internet du week-ends

    Bonne soirée!

  4. #4
    Invité
    Invité(e)
    Par défaut
    mon webService SOAP fonctionne bien (testé par SOAPUI)
    Il n'y aurait pas un moyen de voir le format du JSON que ça génère (Avant le résultat de console.log) ? Est-il possible d'afficher quelque chose dans ton navigateur, en appelant directement la fonction dans le fichier PHP, dans la case url du navigateur ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Dans le cas présent non, je récupère un fichier XML. Cependant, en ayant ce service avec ma factory, il m'en ressort le dernier row. Tout en sachant que angularJS ne lis que du JSON, est ce qu'il considère le dernier item de mon XML comme un object JSON pour l'afficher correctement ? Auquel cas je perds mon temps et je devrais le parser avant de vouloir l'afficher

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    J'y ai ajouté XML2JSON en script pour parser ma réponse XML.

    Dans mon controller, j'essaye d'adapter cela mais je ne suis pas un habitué du JS, j'en ai fais très peu. Ce qui en ressort :

    J'attribue ma réponse XML à la variable xmlData, que j'appelle ensuite avec $http.get pour le parser en JSON. Mais visiblement, j'ai une erreur :
    " GET http://localhost/soapClient/xmlData 404 NotFound"

    Pourtant mon fichier WSDL charge bien, de même que mon service renvoie bien la réponse sous forme xml en tout dernier.

    Vous auriez une piste ?

    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
     
    .controller('MainCtrl', function ($scope, testService, $http) {
     
    	var xmlData = testService.getExternalI();
    			$http.get("xmlData",
    							{	
    	                        transformResponse: function (cnv) {
                                var x2js = new X2JS();
                                var aftCnv = x2js.xml_str2json(cnv);
                                return aftCnv;
    							}
     
    			})
    			.then(function (response){
    				console.log(response);
    				$scope.myData = response;
    			});
    });


    Voici un exemple à part de l'utilisation d'xml2json qui fonctionne :

    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
            var app = angular.module('httpApp', []);
            app.controller('httpController', function ($scope, $http) {
                $http.get("Sitemap3.xml",
                        {
                            transformResponse: function (cnv) {
                                var x2js = new X2JS();
                                var aftCnv = x2js.xml_str2json(cnv);
                                return aftCnv;
                            }
                        })
                .then(function (response) {
                    console.log(response);
    				$scope.myData = response.data;
                });
            });

  7. #7
    Invité
    Invité(e)
    Par défaut
    Il existe aussi ce module angularjs : https://github.com/johngeorgewright/angular-xml pour parser le xml.
    Il faut ajouter le module angular à l'application comme il explique, puis après cela semble gérer ta lib externe X2JS
    Il fournit un exemple plus bas dans sa page
    EDIT : Ouais remarque un autre fais comme toi sur cette page sans module : http://rabidgadfly.com/2013/02/angul...ml-no-problem/
    Dernière modification par Invité ; 11/04/2016 à 14h51.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Edit : J'ai essayé avec la factory du second lien, cela revient à faire ce que j'ai fais plus haut. Je pense ne pas être loin de la solution, je n'arrive simplement pas à placer la réponse xml de mon web service dans $http.get("ICI'', PARSING)...

    Je me trompe peut être de syntaxe en plaçant la réponse xml dans la variable xmlData avant de placer cette même variable dans $http.get dans le controller?

    je remets le code si vous pouvez y jeter un oeil, je suis vraiment bloqué à cette étape crucial :/

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    angular.module('angularSoap', [])
     
    .factory("$soap",['$q',function($q){
    	return {
    		post: function(url, action, params){
    			var deferred = $q.defer();
     
    			//Create SOAPClientParameters
    			var soapParams = new SOAPClientParameters();
    			for(var param in params){
    				soapParams.add(param, params[param]);
    			}
     
    			//Create Callback
    			var soapCallback = function(e){
    				if(e.constructor.toString().indexOf("function Error()") != -1){
    					deferred.reject("An error has occurred.");
    				} else {
    					deferred.resolve(e);
    				}
    			}
     
    			SOAPClient.invoke(url, action, soapParams, true, soapCallback);
     
    			return deferred.promise;
    		}
    	}
    }]);
     
     
     
    angular.module('myApp', ['angularSoap'])
     
    .factory("testService", ['$soap',function($soap){
        var base_url = "http://localhost/ws_ldap/InputServer.php";
     
    	return {
    		getExternalI: function(){
    			return $soap.post(base_url, "getExternalI");			
    		}
     
    	}
    }])
     
    .controller('MainCtrl', function ($scope, testService, $http) {
     
    	var oo = testService.getExternalI();
    					$http.get("oo",
    							{	
    	                        transformResponse: function (cnv) {
                                var x2js = new X2JS();
                                var aftCnv = x2js.xml_str2json(cnv);
                                return aftCnv;
    							}
     
    			})
    			.then(function (response){
    				console.log(response);
    				$scope.myData = response;
    			});
    });

  9. #9
    Invité
    Invité(e)
    Par défaut
    Tu n'aurais pas moyen de générer un fichier XML tout simple avec 2-3 lignes, respectant les normes XML,puis de pointer dessus avec angularJs et de voir déjà si cela fonctionne ainsi ?
    Je suis assez intéressé par l'import XML dans une app AngularJS , malheureusement, je n'ai pratiqué que papaparse

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Niveau performance je risque de perdre un peu à créer un fichier puis le parser derrière non ? Je vais essayer, mais ayant testé les deux méthodes séparément, d'un côté la factory appelle correctement ma méthode 'getExternal' dans mon fichier wsdl et génère correctement la réponse. De l'autre, si je fais une petit application avec le Parseur, cela fonctionne également à partir d'un fichier plat test.xml qui me renvois parfaitement les information à l'écran avec un ng-repeat dans le code HTML.

    Je vais tenter comme cela en attendant de trouver une solution viable.

    Merci d'avoir pris le temps de répondre =)

    A+

Discussions similaires

  1. [2.x] count symfony2 ma boucle n'affiche que la dernière valeur
    Par Medidev dans le forum Symfony
    Réponses: 1
    Dernier message: 31/03/2014, 18h33
  2. [RegEx] Mon regex ne retourne que le premier et dernier match
    Par Babas007 dans le forum Langage
    Réponses: 15
    Dernier message: 12/11/2013, 16h16
  3. [RegEx] Capture multiple : ne renvoie que la dernière valeur
    Par Maelikk dans le forum Langage
    Réponses: 3
    Dernier message: 01/07/2012, 20h41
  4. [Oracle] PHP ne retourne que la dernière ligne d'un resultat d'une procedure stockée ORACLE
    Par tytous dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 08/06/2010, 08h57
  5. Ne retourner que la "meilleure" valeur pour chaque jour
    Par Drakkhen dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/03/2009, 18h03

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