2016-04-16 14 views
1

Ich bin ein Anfänger zu angularjs. In meinem NFC-Projekt möchte ich in der Lage sein, von dem Server Daten basierend auf einem sich ändernden patientId abzurufen.

Allerdings kann ich meine $watch nicht richtig ausführen, obwohl ich sehe, dass die patientId ändert jedes Mal, wenn ich ein neues NFC-Tag scannen.

Nicht sicher, was ich hier vermisse - bitte erleuchte mich!

aktualisiert Per rakslice Empfehlung, habe ich ein Objekt meine Daten in der Fabrik zu halten, und jetzt die html (mit einiger Serverseite Verzögerung) zeigt korrekt die aktualisierten Werte, wenn ein neuer Tag NFC gescannt wird.

var nfc = angular.module('NfcCtrl', ['PatientRecordsService']) 

nfc.controller('NfcCtrl', function($scope, NfcService) { 
    $scope.tagData = NfcService.tagData; 
    $scope.clear = function() { 
     NfcService.clearTag(); 
    }; 
}); 

nfc.factory('NfcService', function($rootScope, $ionicPlatform, $filter, PatientRecordsServi\ 
ce) { 

    var tagData = { 
     tag: null, 
     patientId: null, 
     patientRecords: [] 
    }; 

    $ionicPlatform.ready(function() { 
     nfc.addNdefListener(function(nfcEvent) { 
      //console.log(JSON.stringify(nfcEvent.tag, null, 4)); 
      $rootScope.$apply(function() { 
       tagData.tag = nfcEvent.tag; 
       tagData.patientId = $filter('decodePayload')(tagData.tag.ndefMessage[0]); 
       PatientRecordsService.getPatientRecords(tagData.patientId) 
        .then(
         function(response) { 
          tagData.patientRecords = response 
         }, 
         function(httpError) { 
          throw httpError.status + " : " + 
           httpError.data; 
         }); 
      }); 
      console.log("Tag: ", tagData.tag); 
      console.log("PatientId: ", tagData.patientId); 
     }, function() { 
      console.log("Listening for NDEF Tags."); 
     }, function(reason) { 
      alert("Error adding NFC Listener " + reason); 
     }) 
    }); 

    return { 
     tagData: tagData, 
     clearTag: function() { 
      angular.copy({}, this.tagData); 
     } 
    }; 
}); 

Antwort

0

Ihr Code nicht aktualisiert den patientId Wert in den zurück NfcService, nur die lokale Variable patientId in der Fabrik Funktion.

Versuchen Sie, einen Verweis auf das Objekt, das Sie zurückgeben, in der Factory-Funktion wie in einer lokalen Variablen zu speichern, und verwenden Sie dies, um die patientId zu aktualisieren.

Zum Beispiel ändern, um die Erstellung des Objekts es in einer lokalen Variablen zu setzen:

var nfcService = { 
     tag: tag, 

     patientId: patientId, 

     clearTag: function() { 
      angular.copy({}, this.tag); 
     } 
    }; 

...

return nfcService 

und dann das patientId Update ändern Sie den Wert in die sich ändern Objekt durch die Variable.

nfcService.patientId = $filter('decodePayload')(tag.ndefMessage[0]); 

aktualisieren:

Die grundlegende Tatsache über JavaScript, die Sie verstehen müssen, ist, dass, wenn Sie eine Variable einer anderen zuweisen, wenn die erste Variable wird die zweite Variable einen primitiven Datenwert hatte eine Kopie Wenn also die erste Variable eine Objektreferenz hat, wird die zweite Variable auf das gleiche Objekt gerichtet, auf das die erste Variable zeigt, und auf das Objekt, in das der Wert geändert wird Die erste Variable danach beeinflusst, was Sie durch die zweite Variable sehen, da sie dasselbe Objekt betrachtet.

Ein schnelles Experiment im Browser JavaScript-Konsole Ihnen die Idee geben soll:

> var a = 1; 
> a 
1 
> var b = a; 
> b 
1 
> a = 5; 
> a 
5 
> b 
1 

gegen

> var a = {foo: 1} 
> var b = a 
> a.foo = 5 
> a.foo 
5 
> b.foo 
5 
+0

Ich werde dies einen Versuch geben, aber ich verstehe nicht, dann, wie die 'tag'-Variable wird erfolgreich aktualisiert (zumindest sehe ich das, wenn ich sie in einer HTML-Seite verwende) –

+0

Im Gegensatz zu' patientId', dem Sie einen neuen Wert zuweisen, vergeben Sie mit 'tag' keine Neuer Wert für die Variable, Sie verwenden 'angular.copy()' darauf, wodurch das Objekt, auf das es zeigt, geändert wird . Da dies das gleiche Objekt ist, auf das der 'tag' im zurückgegebenen' NfcService' zeigt, wird Code, der'NfcService' verwendet, die Änderung sehen. Dies ist nur das normale Verhalten der alten JavaScript-Primitivdaten im Vergleich zum Objektreferenzverhalten: http: // stackoverflow.com/a/13266769/60422 – rakslice

+1

Danke für die Erklärung. Durch das Erstellen eines Objekts und das Verschieben von http GET-Anfragen in die Factory konnte ich die Notwendigkeit von "$ watch" im Controller vollständig eliminieren. –