[JavaScript] Accès données

Bonjour,

J’ai commencé mon interface graphique avec constellation et angular. C’est top !

Par contre j’ai un petit soucis et j’ai pas trouvé de solution.

J’ai le package hwmonitor sur plusieurs machines. Au début de ma page j’ai :

constellation.onConnectionStateChanged(function (change) {
  if (change.newState === $.signalR.connectionState.connected) {    constellation.requestSubscribeStateObjects("*", "HWMonitor", "*", "*");
  }
});

Ensuite dans ma page j’utilise :

HWMonitor[’/hdd/1/load/0’].Value.Value

Mais du coup il affiche les données de toutes les machines avec ce package.

J’ai essayé de modifier la ligne :

$scope[message.PackageName][message.Name] = message;

afin d’utiliser le nom de la sentinelle mais ça veut pas fonctionner.

Du coup as-tu une solution ? Merci

Bonjour Hydro,

Le premier paramètre de la fonction requestSubscribeStateObjects correspond au nom de la sentinelle qui publie le StateObject. De cette façon, il suffit de spécifier le nom de la sentinelle de la sorte:

constellation.server.requestSubscribeStateObjects("Sentinel_Name", "HWMonitor", "", "");

Ça devrait résoudre ton problème. Tiens moi au courant!

En replaçant Sentinelle_Name par le nom de la sentinelle ? Mais du coup si j’en ai plusieurs ça revient au même problème ?

Oui tu remplaces Sentinelle_Name par le nom de la sentinelle mais du coup, tu reçois la valeur d’une seule sentinelle.
Peut être qu’en utilisant la wildcard, tu peux filtrer le résultat selon le nom de la sentinelle qui a publié le StateObject.

Si on reprend l’exemple de la documentation (en le modifiant un peu):

 <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
     <title>My CPU load</title>
     <script type="text/javascript" src="Scripts/jquery-1.6.4.min.js"></script>
     <script type="text/javascript" src="Scripts/jquery.signalR-2.2.0.min.js"></script>
     <script type="text/javascript" src="Scripts/Constellation.js"></script>
     <script>
         var constellation = $.signalR.createConstellationClient("http://localhost:8088", "MyAccessKey", "DemoJS");

         constellation.client.onUpdateStateObject(function (message) {
             if (message.SentinelName == "Sentinelle_Name") {
                 $("#cpu").text(message.Value.Value);
             }
         });

         constellation.connection.stateChanged(function (change) {
             if (change.newState === $.signalR.connectionState.connected) {
                 constellation.server.subscribeStateObjects("*", "HWMonitor", "/intelcpu/0/load/0", "*");
             }
         });

         constellation.connection.start();
     </script>
 </head>
 <body>    
     <p>CPU = <span id="cpu"></span> %</p>
 </body>
</html>

La partie intéressante:

         constellation.client.onUpdateStateObject(function (message) {
             if (message.SentinelName == "Sentinelle_Name") {
                 $("#cpu").text(message.Value.Value);
             }
         });

         constellation.connection.stateChanged(function (change) {
             if (change.newState === $.signalR.connectionState.connected) {
                 constellation.server.subscribeStateObjects("*", "HWMonitor", "/intelcpu/0/load/0", "*");
             }
         });

Tu filtres avec l’attribut SentinelName.

A tester mais de ce fait, tu reçois tous les StateObject-s de toutes les sentinelles mais tu filtres après. Je ne sais pas si on peut filtrer avant (meilleurs perfs?).

Merci pour ta solution, je suis arrivé à ça :

                constellation.onUpdateStateObject(function (message) {
                    $scope.$apply(function () {
                        if (typeof $scope[message.PackageName] === 'undefined' || $scope[message.PackageName] === null) {
                            $scope[message.PackageName] = {};
                        }
                        if (message.SentinelName == "ALPHA_UI" && message.PackageName == "HWMonitor" && message.Name == "/intelcpu/0/load/0") {
                            $("#alphacpu").text(message.Value.Value);
                        }else{
                            $scope[message.PackageName][message.Name] = message;
                        }
                    });
                });

Si quelqu’un trouve une solution pour faire fonctionner avec le scope de base je suis preneur.

Hello,

Lorsque tu recois des updates de SO, créé une variable de scope avec le nombre de la machine :

constellation.onUpdateStateObject(function (message) {
    $scope.$apply(function () {
        if (typeof $scope[message.SentinelName] === 'undefined' || $scope[message.SentinelName] === null) {
            $scope[message.SentinelName] = {};
        }
        if (typeof $scope[message.SentinelName][message.PackageName] === 'undefined' || $scope[message.SentinelName][message.PackageName] === null) {
            $scope[message.SentinelName][message.PackageName] = {};
        }
		$scope[message.SentinelName][message.PackageName][message.Name] = message;
    });
});

Ainsi dans ton template HTML tu pourras faire : {{ MaSentinel.MonPackage.MonStateObject.Value }}

Si tu as des caract spéciaux, il faut passer la syntaxe “tableau” avec les [ ] pour définir le nom de la propriété en string. Exemple : {{ ALPHA_UI.HWMonitor[’/intelcpu/0/load/0’].Value }}

Cette remarque est également valide pour les noms de packages et ou sentinelle !

A+

Fonctionne niquel, j’avais pas pensé à faire comme ça c’est plus simple maintenant.