“push()”到Typescript中的数组

时间:2016-04-16 16:59:29

标签: javascript 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;
            }
        });
}

但是,此代码会引发以下错误:

  

JavaScript错误:   file:///app/Pages/Home/home.component.js:99:37:JS ERROR TypeError:undefined不是对象(评估'this.devices.push')

我在使用Typescript,但我知道push函数是一个JS的东西。我不知道怎么会在打字稿中做到这一点 - 我做错了什么?

2 个答案:

答案 0 :(得分:3)

它与TypeScript无关,它只是的正常Javascript规则。

问题这个指向您提供给 onDiscovered 而不是类的功能。

您可以使用已定义的 self 变量或通过重写代码来使用箭头函数来修复它,如下所示:

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;
            }
        });
}

此外,正如Bhabishya所指出的那样,设备的类型是Observable。该类型没有定义推送方法。相反,它将能够发出一系列设备。

如果你需要的只是一个数组,你还应该将设备更改为一个字符串数组,而不是一个Observable of string数组。

devices: Array<string>;

您还必须对其进行初始化。

devices: Array<string> = [];

答案 1 :(得分:2)

您已将设备定义为数组devices: Observable<Array<string>>的Observable,而不是可以调用push()函数的数组devices: Array<string>