Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

angular2 - passing data object between components

Looking for some help, if possible.

I have a data object located in one component, received from a REST call. It contains user details that I would like to share across components, but I am having trouble.

What is the best way to pass this object over to another component, so I can use the details?

Ex. The data object is named user, and I want to share the user._id created from the database and received from the REST call with a separate component.

Thanks everyone for any help.

COMPONENT ONE (contains user data object):

import {Component} from 'angular2/core';
import {ROUTER_DIRECTIVES, Router, Location} from 'angular2/router';
import {Control, FORM_DIRECTIVES, NgIf} from 'angular2/common';
import {UserLogin} from './navbar.login.service';
import {LoginService} from './navbar.login.service';
import {AccountDataService} from '../account/account.data.service';
import {User} from '../account/account.model';

@Component({
selector: 'navbar',
templateUrl: './app/navbar/navbar.component.html',
directives: [ROUTER_DIRECTIVES],
providers: [LoginService, AccountDataService]
})

export class NavbarComponent {

model: UserLogin;
user: User;
message: string;

constructor(private _service: LoginService, public _userService: AccountDataService,
    private router: Router, private location: Location) {
    this.model = this._service.modelInstance();
    this.user = this._userService.modelInstance();
}

onSubmit() {

    this._service.rawPost('?username=' + this.model.userName
        + '&password=' + this.model.password)
        .subscribe(res => {
            if (res.status === 200) {
                this.message = 'You have been logged in with: ' + this.model.userName;
                this.router.navigate(['Dashboard']);
                this._userService.read('/username/' + this.model.userName)
                    .subscribe(user => {
                        this.user = user; // <--- NEED THIS OBJECT PASSED AND SHARED!!
                })
                    });
            } else {
                this.message = 'Username or Password is not correct';
            }
        },
        error => {
            console.log("Response = %s", JSON.stringify(error));
            if (error.status == 401) {
                this.message = 'Username or Password is not correct';
            }
        });

}

toggleMenu() {
    this.menuActive = !this.menuActive;
}

logout() { //NOT SURE ABOUT THIS!!!
    // clears browser history so a user can't navigate with back button
    // this.location.replaceState('/');
    this.router.navigate(['Home']);
}

COMPONENT TWO Needs adjusting. Can't get the user object above to pass in. Not even sure where to start at this point.

import {Component, OnInit} from 'angular2/core';
import {UserCase} from './case/case.model';
import {User} from '../account/account.model';
import {ROUTER_DIRECTIVES} from 'angular2/router'; 
import {AccountDataService} from '../account/account.data.service';
import {NavbarComponent} from '../navbar/navbar.component';

@Component({
selector: 'dashboard',
templateUrl: './app/dashboard/dashboard.component.html',
directives: [NavbarComponent],
providers: [ROUTER_DIRECTIVES, AccountDataService],
})

export class DashboardComponent implements OnInit {

public user: User;
public userCase;
public userCases: UserCase[] = []

ngOnInit() {
    // Also trying to get each userCase object into the userCases array (not currently working)

    this._caseService.read('/user/' + this.user._id) //this.user not currently defined.
        .subscribe(userCase => {
            this.userCase = userCase;
        });

    this.userCases.push(this.userCase);
}

constructor(private _caseService: CaseDataService, private _userService: AccountDataService) {
    this.user = this._userService.modelInstance();
    this.userCase = this._caseService.modelInstance();
    this.userCases = [];
}

}
like image 566
wjfieseler Avatar asked Apr 10 '26 14:04

wjfieseler


1 Answers

The best way is to just pass the data as an input for "Component Two".

So, inside component one, you should do:

<dashboard [user]="user"></dashboard>

and inside Component Two you should add:

@Input() user;

You will not be able to access this input inside Component Two's contractor, only inside its "ngOnInit". See this for reference

like image 123
Yaniv Efraim Avatar answered Apr 12 '26 13:04

Yaniv Efraim



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!