2016-10-04 7 views
15

Ich habe eine einzelne Seite Hypothek Rechner in Angular 2 erstellt, die wie ein Lernspielplatz für mich funktioniert (versuchen, mehr an Technologie Stack derzeit bei der Arbeit verwendet werden) ... Es läuft um http://www.mortgagecalculator123.com, wenn Sie schauen möchten es. Ich habe es Open Source mit einem Fork Me-Link rechts auf der Seite gemacht, wenn Sie es sehen wollen.Angular 2 - Wie übergeben Sie URL-Parameter?

Wie auch immer, ich möchte Variablen direkt von der URL an meine App senden, damit sie von meiner Angular 2 App verwendet werden können. Etwas wie folgt aus: http://www.mortgagecalculator123.com/?var1=ABC&var2=DEF

Ich habe versucht, folgende, in meinem app.component.ts, ich habe folgende hinzugefügt:

import { Router, ActivatedRoute, Params } from '@angular/router'; 

AppComponent { 
private var1: string; 
private var2: string; 

constructor(
    private route: ActivatedRoute, 
    private router: Router 
) {} 

ngOnInit() { 
    this.route.params.forEach((params: Params) => { 
     this.var1 = params['var1']; 
     this.var2 = params['var2']; 
    }); 

    console.log(this.var1, this.var2); 
} 
... 
} 

Aber das wird nicht funktionieren, wenn ich npm laufen beginnen , Bekomme ich folgende Fehlermeldung:

aot/app/app.component.ngfactory.ts (45,30): Fehler TS2346: Die mitgelieferten Parameter stimmen nicht mit einer Signatur des Aufrufziels überein.

enter image description here

Danke, jede mögliche Hilfe würde sehr geschätzt werden.

Antwort

35

Ich erstellte eine Pull-Anfrage mit der Abfrage-Parameter arbeiten. Ich werde versuchen, alles zu erklären, was ich getan habe.

Der Grund, warum die vorherigen Antworten nicht funktionieren, liegt darin, dass Sie den Router überhaupt nicht verwenden. Sie haben eine umfangreiche App-Komponente ohne Routen erstellt. Um zu beheben, dass wir das Routenmodul verwenden müssen, rate ich Ihnen auch, diese beiden Tutorials zu lesen: Routing und Routing & Navigation.

Zunächst müssen wir Ihre index.html ändern, fügen Sie diese zu Ihrer <head>:

<base href="/"> 

Siehe here warum es wichtig ist, dass hinzuzufügen.

Dann, da Sie Ihre AppComponent verwenden, um alles anzuzeigen, was wir benötigen, um eine Bedarfskomponente zu erstellen, die wir RootComponent nennen werden. Auf Ihrer index.html ersetzen Sie die <my-app> durch <root>; es wird wie folgt aussehen:

<root>Loading...</root> 

Jetzt in Ihrem app Ordner wir zwei Dateien die erste wird root.component.ts erstellen müssen, die wie folgt aussehen:

import { Component } from '@angular/core'; 

@Component({ 
    selector: 'root', 
    template: `<router-outlet></router-outlet>`, 
}) 
export class RootComponent { 
    constructor() { } 
} 

Schauen Sie, dass wir die <router-outlet></router-outlet> als haben Vorlage, wird Angular unsere Komponenten basierend auf der Route injizieren.

Wir brauchen noch eine weitere Datei zu erstellen, die main.route.ts sein wird, ist es das, was es sieht aus wie:

import { Routes, RouterModule } from '@angular/router'; 
import { AppComponent } from './app.component'; 

export const mainRoutes: Routes = [ 
    { path: '', component: AppComponent } 
]; 
export const mainRoutingProviders: any[] = []; 
export const routing = RouterModule.forRoot(mainRoutes); 

In dieser Datei wir, dass für unsere Basisstrecke sagen, wir unsere AppComponent machen möchten

wir haben unsere neue Dateien erstellt haben, jetzt müssen wir unsere App-Modul über sie sagen, in Ihrem app.module.ts so importieren wir die neuen Dateien und die neue Komponente deklarieren. Wir müssen auch unsere Bootstrap-Komponente ändern:

import {NgModule}  from '@angular/core'; 
import {BrowserModule} from '@angular/platform-browser'; 
import {FormsModule, ReactiveFormsModule} from "@angular/forms"; 
import {AppComponent} from './app.component'; 
import {RootComponent} from './root.component'; // we import our new RootComponent 
import {ChartModule} from 'primeng/primeng'; 
import {TooltipModule} from 'primeng/primeng'; 
import { routing, mainRoutingProviders } from './main.routes'; // We also import our Routes 

@NgModule({ 
    imports: [ 
    BrowserModule, 
    ChartModule, 
    FormsModule, 
    mainRoutingProviders, // we also need to import our route provider into the module 
    ReactiveFormsModule, 
    routing, // and also import our routes declarations 
    TooltipModule 
    ], 
    declarations: [AppComponent, RootComponent], // we declare our new RootCpmponent 
    bootstrap: [RootComponent] // Notice that we are now using our RootComponent to bootstrap our app 
}) 
export class AppModule { 
} 

nun mit all dem an Ort und Stelle können wir nun endlich vorbei Parameter unserer App starten, auf dem AppComponent Import der Router, ActivatedRoute und die Params von @angular/router so Ihre AppComponent wird in etwa so aussehen:

import { Component, OnDestroy, OnInit } from '@angular/core'; 
import { Router, ActivatedRoute, Params } from '@angular/router'; 
import { Subscription } from 'rxjs/Subscription'; 

export class AppComponent implements OnInit, OnDestroy { 
    private var1: string; 
    private var2: string; 
    private sub: Subscription; 

    constructor(
    private route: ActivatedRoute, 
    private router: Router 
) {} 

    ngOnInit() { 
    // assign the subscription to a variable so we can unsubscribe to prevent memory leaks 
    this.sub = this.route.queryParams.subscribe((params: Params) => { 
     this.var1 = params['var1']; 
     this.var2 = params['var2']; 
     console.log(this.var1, this.var2); 
    }); 
    } 

    ngOnDestroy() { 
    this.sub.unsubscribe(); 
    } 
... 
} 

Sie die Pull-Anforderung here

+1

Fabio, genau das habe ich die ganze Zeit versucht herauszufinden. Ich danke dir sehr. Ich bin immer noch ein Neuling, wenn es um Angular 2 geht, also vielen Dank für Ihre wertvolle Zeit, alles zu erklären. Es funktioniert jetzt nicht nur, aber es war eine großartige Lernübung, die der Logik folgt, die Sie beschrieben haben. Gut verdient 50 Punkte für den Ruf. – jjj

+0

@jjj Sie sind herzlich willkommen. Ich bin froh, dass es geholfen hat. –

+0

Eine weitere Frage .... in app.component.ts, muss es beibehalten werden: "Privater Router: Router", in Zeile 65? Sieht so aus, als wäre das ein ungenutzter Parameter nein? – jjj

0

Es scheint, dass Sie sich mit Queryparams befassen. So, um darauf zuzugreifen, können Sie versuchen, unten Code,

this.var1= this.route 
     .queryParams 
     .map(params => params['var1']); 
+0

sehen kann, wenn ich das tue, ich folgende Fehlermeldungen erhalten: aot/app/app.component.ngfactory.ts (45,30): Fehler TS2346: Mitgelieferte Parameter stimmen nicht mit einer Signatur des Aufrufziels überein. app/app.component.ts (90,39): Fehler TS2339: Eigenschaft 'map' existiert nicht für den Typ 'Observable <{[key: string]: any; }> '. – jjj

+0

Ich habe versucht zu verwenden: import 'rxjs/add/operator/map'; aber dann bin ich zurück zum ursprünglichen Fehler TS2346: Gelieferte Parameter stimmen mit keiner Unterschrift des Anrufziels überein. Verrückt, wie etwas so einfach wie das Passieren von Vars so kompliziert sein kann ... – jjj

+0

Jetzt hat es keinen Sinn mehr herauszufinden. – micronyks

Verwandte Themen