【问题标题】:Angular2 Pass data values on routeAngular2在路线上传递数据值
【发布时间】:2017-06-19 12:51:54
【问题描述】:

我正在尝试将数据从表单传递到服务,但没有成功。我设法在主页和登录页面之间实现工作路由系统。我想将用户名和密码从 LoginComponent 传递给 VehicleService 并显示当前登录用户。我试过了:

  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 { }

车辆服务

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']);
  }
}

简化的登录组件

@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() from LoginComponent 在我提交数据时没有传递任何数据。当我使用一个没有路由系统的组件时,它很好。

谢谢。

【问题讨论】:

  • 什么意思,onSubmit 方法没有被触发,或者您无法从表单中提取值?
  • ..或者您是否希望在登录并导航到用户信息后会跟随车辆?您正在订阅 LoginComponent 中的值,因此值在那里,但是当您离开该组件时,您将失去用户。如果你想存储它以便它在应用程序中可用,你需要使用 localstorage 或 service 来存储用户值。

标签: angular angular2-routing angular2-forms


【解决方案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 检索该数据并对其进行解析。我会在您的服务中添加 I 方法,如下所示:

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

然后在您的VehicleComponent 中调用该方法并获取当前用户:

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

然后您就可以在VehicleComponent 中访问您当前的用户。

除了这个解决方案之外,还有一个共享服务选项也可以为您工作:Components communicate via service。但是,如果您不需要该服务来做其他事情,那可能就有点过头了。

【讨论】:

  • 感谢您的全面回答,它指出了一切。看来,我不理解自己的代码,这就是为什么我的问题被扭曲了。我之前检查了共享服务选项,但对于这样的基本功能来说太复杂了。
  • 没问题,很高兴能帮上忙! :) 是的,这就是我的想法 - 共享服务对于这项任务来说太过分了,localStorage 应该为您的目的做好:)
猜你喜欢
  • 1970-01-01
  • 2017-04-23
  • 2017-05-07
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多