0

I am continuing to teach myself TypeScript and Angular2 and I am still hating it but I must perserver... anyway, I have a Component, that loads a JSON data from a REST service. This JSON data is in a very complex so I wish to break it down and when loading I wish to assign some of the JSON to an array that is of a certain type I have defined. Here is my type... I am listing information of the schools my users went to...

    export class UserSchool {

        constructor (
            public schoolId: number,
            public yearRange: string,
            public schoolName: string
        ) {
            this.schoolId = schoolId;
            this.yearRange = yearRange;
            this.schoolName = schoolName;
        }
    }

Now here is my Component,

import {Component, OnInit} from 'angular2/core';
import {UserData} from '../../services/user-data/UserData';
import {UserSchool} from '../../types/types';
import {Observable} from 'rxjs';

@Component({
    selector: 'profile',
    template: require('app/components/profile/profile.html'),
    providers: [],
    directives: [],
    pipes: []
})

export class Profile implements OnInit {

    userPhotos: any;
    userInfo: any;
    gapageName: string;
    albums: string[];
    userData: any;
    userSchools: UserSchool[];

    constructor(private userData:UserData) {
        this.userSchools = [];
    }

    ngOnInit() {
        // Use forkJoin as we don't need order in the calls
        Observable.forkJoin([
            this.userData.getUserPhotos('123456'),
            this.userData.getUserInfo()]).subscribe(t=> {
            this.userPhotos = t[0];
            this.userInfo = t[1];
            this.gapageName = this.userPhotos.gapageName;

           /*                    
           this.userInfo.data[0].items[0].entries is [Object, Object]
            each item is like so:
            {
            id: 665
            text: "2005 - 2010"
            title: "TownSchool For Bad Children"
            } 
            */
            this.userInfo.data[0].items[0].entries.forEach(function (a) {
                this.userSchools.push(a); // we get problems here...
            });

        });    
    }
}

when I try to loop through the JSON 'this.userInfo.data[0].items[0].entries' from my feed and push it to an array or types 'UserSchool' I get an error! EXCEPTION: TypeError: Cannot read property 'push' of undefined: I thought by adding the this.userSchools = []; to my constructor would get rid of this problem but it doesn't. Then I thought my scoping may be a problem, so in my forEach I tried:

this.userInfo.data[0].items[0].entries.forEach(function (a) {
    this.parent.userSchools.push(a); // still get an error
});

So can someone please tell me why I can't push to my object array? Many thanks in advance!

1 Answer 1

2

You should use arrow functions for the callback you provide to the forEach method to be able to use lexical this:

this.userInfo.data[0].items[0].entries.forEach((a) => {
  this.userSchools.push(a); // we get problems here...
});

In your case, this doesn't correspond to the instance of the component...

See this link for more hints about the lexical this of arrow functions: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions.

Sign up to request clarification or add additional context in comments.

2 Comments

Yep! You're right! Can't believe I missed this one! Whoops!
No worries ;-) It's easier to see this in the code of other developers rather than his own one!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.