Angular2 - служба не определена за пределами конструктора и ngOnInit?

Я ДОЛЖЕН делать что-то не так, но я понятия не имею, что... Я новичок Angular2, спотыкаясь о моем первом приложении ng2.

Я пытаюсь получить доступ к методам в службе из компонента, но служба определяется только в constructor() и ngOnInit(), она возвращается как неопределенная в других моих функциях компонента.

Это похоже на эту проблему, но я использую ключевое слово private и все еще имею проблему.

Вот мой сервис:

import { Injectable } from "@angular/core";
import { AngularFire,FirebaseListObservable } from 'angularfire2';
import { User } from './user.model';

@Injectable()

export class UserService {
    userList$: FirebaseListObservable<any>;
    apples: String = 'Oranges';

    constructor(private af: AngularFire) {
        this.initialize();
    }

    private initialize():void {
        this.userList$ = this.af.database.list('/users');
    }

    getTest(input:String):String {
        return "Test " + input;
    }

    getUser(userId:String):any {
        //console.log('get user',userId);
        let path = '/users/'+userId;
        return this.af.database.object(path);
    }
}

И мой компонент:

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { UserService } from '../../shared/user.service';

@Component({
    moduleId: module.id,
    selector: 'user-detail',
    templateUrl: 'user-detail.component.html'
})
export class UserDetailComponent implements OnInit {

    routeParams$: any;

    one: String;
    two: String;
    three: String;

    constructor(private usrSvc:UserService,private route:ActivatedRoute) {
        console.log('constructor',usrSvc);  // defined here
        this.one = usrSvc.getTest('this is one');  // works correctly
    }

    ngOnInit() {
        console.log('ngOnInit',this.usrSvc);  // also defined here
        this.two = this.usrSvc.getTest('this is two');  // also works correctly
        this.routeParams$ = this.route.params.subscribe(this.loadUser);

    }

    loadUser(params:any) {
        console.log('loadUser',this.usrSvc);   // undefined!!
        this.three = this.usrSvc.getTest('this is three');  // BOOM
    }

    ngOnDestroy() {
        if (this.routeParams$) {
            console.log('unsub routeParams$');
            this.routeParams$.unsubscribe();
        }
    }
}

1 ответ

Решение

Это от того, как вы передаете функцию

this.routeParams$ = this.route.params.subscribe(this.loadUser);

должно быть

this.routeParams$ = this.route.params.subscribe(this.loadUser.bind(this));

или же

this.routeParams$ = this.route.params.subscribe((u) => this.loadUser(u));

иначе this не указывает на ваш текущий класс, но где-то на наблюдаемый (откуда он называется)

Другие вопросы по тегам