2016-04-16 8 views
2

Ich habe den folgenden Code, um für ein Bluetooth-Gerät zu suchen, die für jedes Gerät gefunden, möchte ich das Gerät zu einem Array hinzufügen."push()" zu einem Array in Typescript

devices: Observable<Array<string>>; 

bluetoothAdd() { 
    this.isScanning = true; 
    var plusIcon = this.page.getViewById("add"); 
    plusIcon.style.opacity = 0; 

    var self = this; 
    bluetooth.hasCoarseLocationPermission().then(
     function (granted) { 
      if (!granted) { 
       bluetooth.requestCoarseLocationPermission(); 
      } else { 
       bluetooth.startScanning({ 
        serviceUUIDs: ["133d"], 
        seconds: 4, 
        onDiscovered: function (peripheral) { 
         console.log("Periperhal found with UUID: " + peripheral.UUID); 
         this.devices.push(peripheral); // <- Problem Line 
        } 
       }).then(function() { 
        console.log("scanning complete"); 
        self.isScanning = false; 
        plusIcon.style.opacity = 1; 
       }, function (err) { 
        console.log("error while scanning: " + err); 
       }); 
       this.isScanning = false; 
      } 
     }); 
} 

jedoch dieser Code führt den folgenden Fehler:

JavaScript error: file:///app/Pages/Home/home.component.js:99:37: JS ERROR TypeError: undefined is not an object (evaluating 'this.devices.push')

ich in Typoskript arbeite, aber ich weiß, dass die Push-Funktion eine JS Sache. Nicht sicher, wie ich das in Typoskript machen würde - was habe ich falsch gemacht?

+1

Dies hat nichts mit TypeScript zu tun. 'Das' ist nicht das, was Sie erwarten. Siehe http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work. Sie können 'self' verwenden, obwohl – elclanrs

Antwort

3

Es hat nichts mit TypeScript zu tun, es ist nur normale Javascript-Regeln für dieser.

Das Problem diese verweist auf die Funktion, die Sie geben onDiscovered anstelle der Klasse.

Sie können das Problem beheben, indem Sie die Selbst Variable, die Sie definiert haben, oder indem Sie den Code umschreiben statt Pfeil Funktionen zu verwenden, wie folgt aus:

devices: Observable<Array<string>>; 

bluetoothAdd() { 
    this.isScanning = true; 
    var plusIcon = this.page.getViewById("add"); 
    plusIcon.style.opacity = 0; 


    bluetooth.hasCoarseLocationPermission().then(
     (granted) => { 
      if (!granted) { 
       bluetooth.requestCoarseLocationPermission(); 
      } else { 
       bluetooth.startScanning({ 
        serviceUUIDs: ["133d"], 
        seconds: 4, 
        onDiscovered: (peripheral) => { 
         console.log("Periperhal found with UUID: " + peripheral.UUID); 
         this.devices.push(peripheral); // <- Problem Line 
        } 
       }).then(() => { 
        console.log("scanning complete"); 
        this.isScanning = false; 
        plusIcon.style.opacity = 1; 
       }, (err) => { 
        console.log("error while scanning: " + err); 
       }); 
       this.isScanning = false; 
      } 
     }); 
} 

Auch als Bhabishya die Art der darauf hingewiesen, Geräte ist beobachtbar. Für diesen Typ ist keine Push-Methode definiert. Stattdessen wird es in der Lage eine Reihe von Geräten zu emittieren.

Wenn alles, was Sie brauchen, ein Array ist, sollten Sie auch die Geräte zu einem Array von String, anstelle eines Observable Array-String ändern.

devices: Array<string>; 

Sie müssen es auch initialisieren.

devices: Array<string> = []; 
+0

Sind Sie sicher über das' this' Problem? In seiner ** onDiscovered ** -Funktion sollte "this" sich auf die Klasse beziehen, da er ** arows ** verwendet, und im Gegensatz zu Funktionen ** teilen ** die Pfeile das gleiche lexikalische "this" wie ihr umgebender Code. Es gibt keinen neuen Kontext. –

+0

@PaulBoutes Es gibt keine Pfeilfunktionen im ursprünglichen Beitrag. Hinzufügen von ihnen ist die Lösung. – toskv

+1

Mein schlechtes, habe ich nicht gesehen! –

2

Sie haben Geräte als Observable des Arrays devices: Observable<Array<string>> definiert und nicht ein Array devices: Array<string>, auf dem Sie die Funktion push() aufrufen können.