Как использовать URLSearchParams в Angular 2

Я уже часами пытаюсь понять, как правильно ввести зависимость URLSearchParams в компонент.

В моем boot.ts я обязательно включу HTTP_PROVIDERS - я честно даже не уверен, что это требуется для URLSearchParams.

Я также гарантировал, что я включу http-пакет script на моей странице.

boot.ts

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

Это FiltersService, где я пытаюсь ввести URLSearchParams.

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 в конструкторе вызывает ошибку:

введите описание изображения здесь

Я прочитал эту статью, пару раз на самом деле и не могу понять, где я ошибаюсь.

Для чего это стоит, я сталкиваюсь с той же проблемой при попытке ввести RouteParams. Мне явно не хватает чего-то фундаментального.

EDIT. Для большей ясности это выглядит как < StoriesComponent:

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: здесь plunk, который демонстрирует мою проблему - см. peopleService.ts

Ответы

Ответ 1

Итак, после большого исследования и помощи от Angular Gitter, я узнал ответ на две из моих проблем.

Во-первых, URLSearchParams не может быть введен в конструкторе как зависимость, как я пытаюсь сделать - это может быть new ed.

var params = new URLSearchParams()

Он также не может использоваться, поскольку я надеялся, что это может произойти, что должно было обновить местоположение. Это просто функция утилиты для синтаксического анализа строк запроса и установки параметров запроса, которые затем можно использовать с помощью метода Router navigate.

Во-вторых, для доступа к RouteParams кажется, что ваш компонент должен быть создан Router, т.е. связывает ваш компонент с контуром в декораторе @RouteConfig.

Это был не мой случай, поскольку в оболочке моего приложения был <my-component></my-component>, который не был создан Router.

Это мое настоящее понимание и, надеюсь, это помогает другим с той же проблемой.

Ответ 2

Я сделал работу с инъекцией RouteParams в пределах Angular2 beta0. Какую версию вы используете?

Нам просто нужно указать поставщиков маршрутов по всему миру для вашего приложения, как вы это делали:

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

Затем просто импортируйте RouteParams, где вы хотите его использовать, и добавьте его в конструктор вашего компонента. Angular предоставит вам соответствующий экземпляр:

import { RouteParams } from 'angular2/router';

export class CompanyDetails implements OnInit {
  public company: Company;

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

Поскольку вы укажете его глобально, вам не нужно указывать его снова в атрибуте поставщиков компонента:

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

В противном случае, что вы точно хотите сделать с классом URLSearchParams?

Надеюсь, это поможет вам, Thierry