javascript - „push()” într-un array în Typescript
Am următorul cod, pentru a scana un dispozitiv Bluetooth, pentru care, pentru fiecare dispozitiv găsit, vreau să adaug dispozitivul într-un tablou.
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;
}
});
}
Totuși, acest cod generează următoarea eroare:
Eroare JavaScript: file:///app/Pages/Home/home.component.js:99:37: EROARE JS TypeError: undefined nu este un obiect (evaluând 'this.devices.push')
Lucrez în Typescript, dar știu că funcția push este un lucru din JS. Nu sunt sigur cum aș face asta în Typescript - ce am greșit?
Răspuns #1
Nu are nicio legătură cu TypeScript, sunt doar regulile normale JavaScript pentru this.
Problema acestui se referă la funcția pe care o dai lui onDiscovered în loc de clasă.
Poți să îl repari folosind variabila self pe care ai definit-o sau rescriind codul pentru a folosi funcții săgeată în schimb, astfel:
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;
}
});
}
De asemenea, așa cum a subliniat Bhabishya, tipul de dispozitive este Observable. Acest tip nu are definită nicio metodă push. În schimb, va putea să emită un array de Dispozitive.
Dacă tot ce ai nevoie este un array, ar trebui, de asemenea, să schimbi devices pentru a fi un array de string-uri, în loc de un Observable de array de string-uri.
devices: Array<string>;
Va trebui să-l inițializați și pe acesta.
devices: Array<string> = [];
Răspunsul #2
Ai definit dispozitivele ca Observable de array devices: Observable<Array<string>> și nu ca un array devices: Array<string> pe care poți apela funcția push().
