2015-12-20 5 views
16

Ich habe Stunden damit verbracht, herauszufinden, wie man die URLSearchParams Abhängigkeit in eine Komponente korrekt injiziert.So verwenden Sie URLSearchParams in Angular 2

In meiner boot.ts stelle ich sicher, dass HTTP_PROVIDERS enthalten - ich bin ehrlich gesagt nicht einmal sicher, dass es für URLSearchParams erforderlich ist.

Ich habe auch sichergestellt, dass ich das http-Bundle-Skript in meiner Seite einschließen.

boot.ts

bootstrap(AppComponent, [ 
    HTTP_PROVIDERS, 
    ROUTER_PROVIDERS, 
    provide(LocationStrategy, {useClass: HashLocationStrategy}), 
    PanelsService, 
    FiltersService 
]) 

Es ist FiltersService wo ich URLSearchParams zu injizieren bin versucht.

filter.service.ts

import {Component, Injectable} from 'angular2/core'; 
import {URLSearchParams} from 'angular2/http'; 

@Injectable() 
export class FiltersService { 

    constructor(private _searchParams:URLSearchParams) { } 

    setFilter(name, value) { 
    this._searchParams.set(name, value); 
    } 

    getFilter(name) { 
    this._searchParams.get(name); 
    } 
} 

URLSearchParams im Konstruktor Injektion verursacht den Fehler:

enter image description here

I this article, ein paar Mal in der Tat gelesen habe und kann nicht herausfinden, wo ich falsch liege.

Für was es wert ist, stoße ich auf das gleiche Problem beim Versuch, RouteParams zu injizieren. Mir fehlt eindeutig etwas Grundlegendes.

EDIT: Für etwas mehr Klarheit ist das, was meine StoriesComponent wie folgt aussieht:

import {Component, OnInit} from 'angular2/core'; 
import {PanelsService} from '../panels/panels.service'; 
import {RouteParams} from 'angular2/router'; 
import {FiltersService} from '../common/filters.service'; 

@Component({ 
    selector: 'stories', 
    templateUrl: 'app/components/stories/stories.component.html' 
}) 
export class StoriesComponent implements OnInit { 

    constructor(public panelsService:PanelsService, 
    public filtersService: FiltersService, 
    private _routeParams:RouteParams) { 

    this.panelsService.setSelectedPanel(this._routeParams.params['panelId']); 
    } 

    ngOnInit() { 
    console.log('Stories'); 
    } 

    addPanel() { 
    var newPanel = { 
     id: 999, 
     name: 'my new panel name', 
     time: 744 
     // time: 168 
    } 

    this.panelsService.addPanel(newPanel); 
    } 
} 

EDIT 2: Hier ein plunk ist das mein Problem demonstriert - siehe peopleService.ts

+0

Was ist storiesComponent in Ihrem Projekt? Ich denke, Problem ist in der Klasse nicht im Filter.Service überprüfen Sie wieder storiesComponent. –

+0

@PardeepJain Ich habe meine Frage mit dem Inhalt meiner 'StoriesComponent' aktualisiert – garethdn

Antwort

15

So nach viel Forschung und Hilfe von Winkel der Gitter, ich habe die Antwort auf zwei meiner Probleme herausgefunden.

Erstens kann URLSearchParams nicht in den Konstruktor als eine Abhängigkeit injiziert werden, wie ich es versuche - es kann new Ed aber sein.

var params = new URLSearchParams()

Es ist auch, wie ich es gehofft werden kann, nicht verwendet wurde, konnte, die den Standort zu aktualisieren war. Es scheint einfach eine Dienstprogrammfunktion zum Analysieren von Abfragezeichenfolgen und zum Festlegen von Abfrageparametern zu sein, die Sie dann mit Routers navigate Methode verwenden können.

Zweitens, um auf RouteParams zuzugreifen scheint es, dass Ihre Komponente von Router instanziiert werden muss, d. H. Ihre Komponente mit einem Pfad in einem @RouteConfig Decorator verknüpfen.

Dies war nicht mein Fall, wie ich eine <my-component></my-component> in der Shell meiner Anwendung hatte, die nicht durch die Router instanziiert wurde.

Dies ist mein derzeitiges Verständnis und hoffentlich hilft dies anderen mit dem gleichen Problem.

+2

+1 für die Erwähnung dieser Tatsache - "Zweitens muss die Komponente, um auf RouteParams zuzugreifen, vom Router instanziiert werden, dh Ihre Komponente muss mit einem Pfad in einem @RouteConfig-Dekorator verknüpft werden." –

1

ich Arbeit gemacht die Injektion von RouteParams in Angular2 beta0. Welche Version verwendest du?

Wir müssen einfach Route Provider weltweit für Ihre Anwendung angeben, wie Sie tat:

import {ROUTER_PROVIDERS} from 'angular2/router'; 
(...) 
bootstrap(ApisparkApp, [ 
    (...) 
    ROUTER_PROVIDERS 
]); 

Dann einfach importieren RouteParams wo möchten Sie es verwenden und es im Konstruktor Ihrer Komponente hinzuzufügen. Angular finden Sie die entsprechende Instanz geben:

import { RouteParams } from 'angular2/router'; 

export class CompanyDetails implements OnInit { 
    public company: Company; 

    constructor(routeParams: RouteParams) { 
    this.routeParams = routeParams; 
    } 
} 

Da Sie es global angeben, müssen Sie es in der Anbieter-Attribut der Komponente wieder nicht angeben:

@Component({ 
    selector: 'company-details', 
    providers: [ CompanyService ] 
}) 

Ansonsten, was tun Sie genau mit Klasse URLSearchParams zu tun?

Hoffe, es hilft Ihnen, Thierry

+2

Hallo, vielen Dank für Ihre Antwort. Ich benutze 'angular2": "2.0.0-beta.0'. Wenn ich genau das mache, was Sie oben mit 'RouteParams' gemacht haben, bekomme ich' No provider for RouteParams! '. Der einzige Ort, auf den ich 'RouteParams' zugreifen kann, ist eine Komponente, die in meinem' @ RouteConfig' Dekorator angegeben ist. Das ist also Problem 1. Problem 2 ist 'URLSearchParams' injizieren. Ich möchte darauf zugreifen, um Parameter zu erhalten und einzustellen: https://angular.io/docs/ts/latest/api/http/URLSearchParams-class.html – garethdn

+0

Aktualisierte Post mit Plunker Beispiel – garethdn