Ionic 3 и Ngzone() не работают
Я хочу выполнить некоторые действия после подключения Bluetooth и наоборот.
Обрабатывал сценарии для подключения, а также добавлял обработчик успеха и неудачи, а также изменяя флаг на True и False в этих функциях обработчика.
Я напечатал это значение с помощью console.log, оно изменяется в файле компонента, но не отражается в HTML.
Я пытался использовать ngZone, но он не работает.
Код успешного и неудачного дескриптора выглядит следующим образом:
BluetoothService
import { Injectable } from "@angular/core";
import { BLE } from '@ionic-native/ble';
@Injectable()
export class BlueToothService {
constructor(private ble: BLE){
}
public connect = (deviceId, onConnect, onFailure) => {
this.ble.isConnected(deviceId)
.then(response => {
console.log("BlueToothService :: isConnected Function :: success :: device----", response);
onConnect(response);
},
error => {
this.ble.connect(deviceId)
.subscribe(response => {
console.log("BlueToothService :: connect Function :: success :: device----", response);
onConnect(response);
},
error => {
console.log("BlueToothService :: connect Function :: error :: device----", error);
onFailure(error);
});
});
} }
Файл компонента
import {Component, NgZone} from '@angular/core';
import {Events, IonicPage, NavController, NavParams, ViewController} from 'ionic-angular';
import {BlueToothService} from '../../../providers/bluetooth/bluetooth.service';
@IonicPage()
@Component({
selector: 'test-data',
templateUrl: 'test-data.html',
})
export class AddTestKitDataPage {
public isBluetoothConnected: boolean = false;
public deviceId: any;
public connectToBLE() {
this.blueToothService.connect(this.deviceId, onConnectionSuccess, onConnectionFailure); //Assume device id is already present
}
private onConnectionSuccess = (reason) => {
this.zone.run(() => {
this.isBluetoothConnected = true;
console.log("isBluetoothConnected---", this.isBluetoothConnected);
});
};
private onConnectionFailure = (reason) => {
this.zone.run(() => {
this.isBluetoothConnected = false;
console.log("isBluetoothConnected---", this.isBluetoothConnected);
});
} }
HTML
<ion-content>
<div text-center *ngIf="!isBluetoothConnected">
Bluetooth Connection failure
</div>
<div text-center *ngIf="isBluetoothConnected">
Bluetooth Connection success
</div>
<button ion-button full class="primaryBlockButton" (click)="connectToBLE()">Click</button>
</ion-content>
1 ответ
Так как console.log действительно подтверждает, что в вашем случае данные действительно изменяются, а представление (шаблон) не получает обновления - это указывает на то, что обнаружение изменений не происходит.
Чтобы подтвердить, что вы уже попробовали "взломать" и, по вашему мнению, в комментариях это сработало:
private onConnectionSuccess = (reason) => {
this.zone.run(() => {
setTimeout(() => {
this.isBluetoothConnected = true;
console.log("isBluetoothConnected---", this.isBluetoothConnected);
},0)
});
};
По сути, хакер "оборачивает" ваши изменения данных в асинхронное (setTimeout) действие, которое захватывает Angular.
Теперь для ее решения вы можете либо убедиться, что изменение данных в вашем случае происходит через событие, которое Angular воспринимает естественным образом (например, добавить пользовательский даже прослушиватель).
Или попробуйте использовать обнаружение изменений для обнаружения изменений вручную после изменения данных:
импорт CDR:
import { ChangeDetectorRef } from '@angular/core';
впрысните это:
constructor (private cdr: ChangeDetectorRef) {}
Добавьте его в свой метод:
private onConnectionSuccess = (reason) => {
this.isBluetoothConnected = true;
console.log("isBluetoothConnected---", this.isBluetoothConnected);
this.cdr.detectChanges();
};
Попробуйте этот подход, так как я думаю, что это будет лучше, чем взломать.