Typescript, проблема с «this» внутри функций стрелок и rxjs - PullRequest
0 голосов
/ 18 октября 2019

я пытаюсь передать в массив внутри подписного метода rxjs используя =>, но переменная, которая является массивом снаружи, превращается в объект внутри, поэтому я не могу использовать .push

@Component({
    selector: 'devices_status-panel',
    templateUrl: './devices.component.html',
    styleUrls: ['./devices.component.scss']
})

export class DevicesComponent implements OnInit {

    public rows = Array<any>();
    public columns = [
    { date: 'Fecha' },
    { deviceId: 'Equipo' },
    { error: 'Estado' },
    { statusType: 'Evento'},
    { location: 'Localidad'},
    { ip: 'Ip' },
    { version: 'Version' },
    { unencriptedMessage: 'Mensaje'}
    ];

    constructor(private devicesData: DevicesData) {


console.log("0")
console.log(this.rows)
this.getDeviceState();

    }


    getDeviceState(){ 

        this.devicesData.getStatePipe()
        .subscribe(([deviceState, info]) => {
            console.log("1")
            console.log(this.rows)

            Object.keys(deviceState).forEach((key1) => {
                const thisState: DeviceState = deviceState[key1];
                console.log("2")
                console.log(this.rows)


                Object.keys(thisState.status).forEach((key2) => {
                    console.log("3")
                    console.log(this.rows)


                    const status: Status = thisState.status[key2];



                    if (status){
                        const eventGroupArray: Array<Array<DeviceEvent>> = status.deviceStatus;
                        eventGroupArray.forEach((eventArray) => {
                            eventArray.forEach((event) => {

                                const state: StateArray = {
                                    date: event.date,
                                    deviceId: event.deviceId,
                                    error: status.error,
                                    ip: event.ip,
                                    statusType: event.statusType,
                                    unencriptedMessage: event.unencriptedMessage,
                                    version: event.version,
                                    location: null

                                };
                                if (info.info[thisState.id]){
                                    state.location = info.info[thisState.id];
                                }else{
                                    state.location = "Desconocida"
                                }
                                console.log(this.rows)
                                console.log(typeof this.rows)
                               this.rows.push(state);
                            });
                        });
                    }

                });

            });

        });
        console.log(this.rows)

    }
}

Как вы можетеПосмотрите, я добавил журналы внутри подписки и непосредственно перед вызовом функции, это массив снаружи и объект внутри

Я пытался решить это сам, но я не могу найти, в чем проблема, любая помощь приветствуется Спасибо

Ответы [ 2 ]

3 голосов
/ 18 октября 2019

Вы не показали нам, что показывают операторы log, но если они показывают что-то другое, причина only , которая произойдет, заключается в том, что что-то присваивается this.rows между временем входа в систему. это до подписки и времени, когда происходит подписка, как в этом примере с использованием setTimeout:

const foo = {
    example() {
        this.rows = [];
        console.log(1, this.rows);
        setTimeout(() => {
            console.log(2, this.rows);
        }, 100);
    }
};
foo.example();
foo.rows = {};

this внутри функции стрелки будет таким же, как и снаружи, потому что именно так работают функции стрелки. Так что если this.rows меняется, это потому, что что-то меняет это.

0 голосов
/ 18 октября 2019

Это может быть проблема закрытия. Попробуйте добавить

getDeviceState(){
  const _that = this;
  .
  .
  .code...
  _that.rows.push(state);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...