2017-02-02 11 views
1

Я пытаюсь передать данные из формы в службу, но безуспешно. Мне удалось реализовать рабочую систему маршрутизации между главной страницей и страницей входа. Я хотел бы передать имя пользователя и пароль от LoginComponent к VehicleService и отобразить в настоящее время пользователя входа. Я пробовал:Angular2 Передача данных по маршруту

  1. Создание LoginService для передачи данных в VehicleService.

Вот код:

маршрутизатор

import { NgModule } from '@angular/core'; 
import { RouterModule, Routes } from '@angular/router'; 

import { VehicleComponent } from './vehicle.component'; 
import { LoginComponent } from './login.component'; 

const routes: Routes = [ 
    { path: '', redirectTo: '/vehicle', pathMatch: 'full' }, 
    { path: 'vehicle', component: VehicleComponent }, 
    { path: 'login', component: LoginComponent } 
]; 

@NgModule({ 
    imports: [RouterModule.forRoot(routes)], 
    exports: [RouterModule] 
}) 
export class AppRoutingModule { } 

VehicleService

import { Injectable } from '@angular/core'; 
import { Http } from '@angular/http'; 
import { Md5 } from 'ts-md5/dist/md5'; 

import { User } from './user'; 
import 'rxjs/add/operator/map'; 

@Injectable() 
export class VehicleService { 
    private defUrl = 'dummywebiste.com'; 

    constructor(private http: Http) { } 
    getVehicle(username?: string, password?: string) { 
     const url = (!username || !password) ? this.defUrl : 'dummywebiste.com' + username + '/' + Md5.hashStr(password); 
     return this.http.get(url) 
      .map(res => res.json()); 
    } 
} 

Упрощенная VehicleComponent

@Component({ 
    selector: 'vehicle-json', 
    templateUrl: './vehicle.html', 
    providers: [VehicleService] 
}) 
export class VehicleComponent { 
    public vehicles: GeneralVehicle[]; 

    constructor(private vehicleService: VehicleService, private router: Router) { 
    this.vehicleService.getVehicle().subscribe(vehicle => { 
     this.vehicles = vehicle; 
    }); 
    } 

    toLogin(): void { 
    console.log("toLogin button"); 
    this.router.navigate(['/login']); 
    } 
} 

упрощенный LoginComponent

@Component({ 
    selector: 'login', 
    templateUrl: './login.html', 
    providers: [VehicleService] 
}) 
export class LoginComponent implements OnInit { 
    public user: FormGroup; 

    ngOnInit() { 
     this.user = new FormGroup({ 
      username: new FormControl('', Validators.required), 
      password: new FormControl('', Validators.required) 
     }); 
    } 

    constructor(public vehicleService: VehicleService, private location: Location, private router: Router) { } 

    onSubmit(user) { 
     this.vehicleService 
      .getVehicle(user.value.username, user.value.password) 
      .subscribe(user => { 
       this.user = user; 
       //this.user.reset(); 
       this.router.navigate(['/vehicle']); 
       console.log("Submit button"); 
      }); 
    } 
    goBack(): void { 
     console.log("Back button"); 
     this.location.back(); 
    } 
} 

onSubmit() из LoginComponent не передает данные, когда я отправить данные. Когда я использовал один компонент без системы маршрутизации, все было в порядке.

Спасибо.

+0

Что вы имеете в виду, метод onSubmit не запускается или вы не можете извлечь значения из формы? – Alex

+0

.. или вы ожидаете, что после входа в систему и навигации к транспортным средствам, которые последуют за информацией пользователя?Вы подписываете значение в LoginComponent, поэтому значения есть, но когда вы переходите от этого компонента, вы теряете пользователя. Если вы хотите сохранить его так, чтобы он был доступен в приложении, вам нужно использовать localstorage или службу, чтобы скрыть пользовательские значения. – Alex

ответ

1

При регистрации вы подписываетесь к значениям в LoginComponent:

.subscribe(user => { 
    this.user = user; // values are here 
    this.router.navigate(['/vehicle']); // values lost when navigating away 

Так информация о пользователе находится в вашем LoginComponent, но второй вы направляете от этого компонента вы теряете свои данные. Чтобы сохранить его во время сеанса, вы можете, например, использовать HTML localStorage, подробнее об этом here.

Так установить пользователя в localStorage Прежде чем перейти на страницу:

.subscribe(user => { 
    this.user = user; 
    localStorage.setItem('currentUser', JSON.stringify(this.user)); 
    this.router.navigate(['/vehicle']); 

Затем в VehicleComponent вы извлекаете, что данные из LocalStorage и разобрать его. Я хотел бы добавить метод ввода в вашей службе, например, так:

getUser(): any { 
    return JSON.parse(localStorage.getItem('currentUser')); 
} 

, а затем в вашем VehicleComponent вызова, метод и получить текущий пользователь:

ngOnInit() { 
    this.user = this.vehicleService.getUser(); 
} 

Тогда у вас есть доступ к вашему текущему пользователю в вашем VehicleComponent.

Помимо этого решения, есть возможность совместного использования, которое может сработать для вас: Components communicate via service. Но это может быть излишним, если вам не нужна услуга ни для чего другого.

+0

Благодарим вас за подробный ответ, он указывает все. Кажется, я не понял свой собственный код, поэтому мой вопрос был искажен. Ранее я проверил опцию общего сервиса, но для таких базовых функций он был слишком сложным. – Haseoh

+0

Без проблем, рад, что я мог бы помочь! :) И да, это было то, что я подумал, - что совместное обслуживание будет излишним для этой задачи, localStorage должен преуспеть для вашей цели :) – Alex