Mam problem z HTTP w Angular.
Chcę tylko GET
z JSON
listy i wyświetlić je w widoku.
Klasa usług
import {Injectable} from "angular2/core";
import {Hall} from "./hall";
import {Http} from "angular2/http";
@Injectable()
export class HallService {
public http:Http;
public static PATH:string = 'app/backend/'
constructor(http:Http) {
this.http=http;
}
getHalls() {
return this.http.get(HallService.PATH + 'hall.json').map((res:Response) => res.json());
}
}
I w HallListComponent
wywołuję getHalls
metodę z usługi:
export class HallListComponent implements OnInit {
public halls:Hall[];
public _selectedId:number;
constructor(private _router:Router,
private _routeParams:RouteParams,
private _service:HallService) {
this._selectedId = +_routeParams.get('id');
}
ngOnInit() {
this._service.getHalls().subscribe((halls:Hall[])=>{
this.halls=halls;
});
}
}
Mam jednak wyjątek:
TypeError: this.http.get (...). Mapa nie jest funkcją w [null]
hall-center.component
import {Component} from "angular2/core";
import {RouterOutlet} from "angular2/router";
import {HallService} from "./hall.service";
import {RouteConfig} from "angular2/router";
import {HallListComponent} from "./hall-list.component";
import {HallDetailComponent} from "./hall-detail.component";
@Component({
template:`
<h2>my app</h2>
<router-outlet></router-outlet>
`,
directives: [RouterOutlet],
providers: [HallService]
})
@RouteConfig([
{path: '/', name: 'HallCenter', component:HallListComponent, useAsDefault:true},
{path: '/hall-list', name: 'HallList', component:HallListComponent}
])
export class HallCenterComponent{}
app.component
import {Component} from 'angular2/core';
import {ROUTER_DIRECTIVES} from "angular2/router";
import {RouteConfig} from "angular2/router";
import {HallCenterComponent} from "./hall/hall-center.component";
@Component({
selector: 'my-app',
template: `
<h1>Examenopdracht Factory</h1>
<a [routerLink]="['HallCenter']">Hall overview</a>
<router-outlet></router-outlet>
`,
directives: [ROUTER_DIRECTIVES]
})
@RouteConfig([
{path: '/hall-center/...', name:'HallCenter',component:HallCenterComponent,useAsDefault:true}
])
export class AppComponent { }
tsconfig.json
{
"compilerOptions": {
"target": "ES5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
},
"exclude": [
"node_modules"
]
}
Http
usługa zwraca obserwowalny1.8.36
, podczas gdy jako przewodnik szybkiego startu ng2 (jak to piszę) używa"typescript": "^2.0.2"
. Aktualizacja języka TS. obsługa za pośrednictwem rozszerzeń i aktualizacji załatwiła sprawę. Podczas instalacji tej aktualizacji natknąłem się na odpowiedź SO , która kończy się tym samym wnioskiem.Odpowiedzi:
Myślę, że musisz to zaimportować:
Lub bardziej ogólnie, jeśli chcesz mieć więcej metod obserwowalnych. OSTRZEŻENIE: Spowoduje to zaimportowanie wszystkich ponad 50 operatorów i doda ich do aplikacji, wpływając w ten sposób na rozmiar pakietu i czas ładowania.
Zobacz ten problem, aby uzyskać więcej informacji.
źródło
import 'rxjs/add/operator/do'
... Chociaż nie musimy.map()
już tego robić . Ale to pomogło mojej.do()
sprawie, aby zdać sobie sprawę, że muszę ją zaimportować. Dziękuję Ci! Jeden głos ode mnie :)Tylko trochę tła ... Nowo opracowany przewodnik deweloperów komunikacji serwera omawia / wspomina / wyjaśnia to:
Ponieważ @Thierry już odpowiedział, możemy po prostu przyciągnąć operatorów, których potrzebujemy:
Lub, jeśli jesteśmy leniwi, możemy pobrać pełny zestaw operatorów. OSTRZEŻENIE: spowoduje to dodanie wszystkich ponad 50 operatorów do pakietu aplikacji i wpłynie na czasy ładowania
źródło
Począwszy od rxjs 5.5 , możesz używać operatorów potokowych
Co jest nie tak z
import 'rxjs/add/operator/map';
Kiedy zastosujemy to podejście,
map
operator zostanie do niego załatanyobservable.prototype
i stanie się częścią tego obiektu.Jeśli później zdecydujesz się usunąć
map
operatora z kodu, który obsługuje obserwowalny strumień, ale nie usunie odpowiedniej instrukcji importu, kod, który implementuje,map
pozostaje częściąObservable.prototype
.Gdy producenci pakietów próbują wyeliminować nieużywany kod ( alias
tree shaking
), mogą zdecydować o zachowaniu kodumap
operatora w polu Obserowalnym, nawet jeśli nie jest on używany w aplikacji.Rozwiązanie -
Pipeable operators
Operatory z możliwością potoku są czystymi funkcjami i nie łatają Observable . Można importować operatory za pomocą składni importu ES6,
import { map } from "rxjs/operators"
a następnie zawinąć je w funkcję,pipe()
która przyjmuje zmienną liczbę parametrów, tj. Operatory łańcuchowe.Coś takiego:
źródło
W Angular 5 import RxJS jest ulepszony.
Zamiast
Teraz możemy
źródło
Korzystanie
Observable.subscribe
bezpośrednio powinno działać.źródło
W przypadku wersji Angular 5 i nowszych zaktualizowana linia importowania wygląda następująco:
LUB
Również te wersje całkowicie obsługują Pipable Operators, więc możesz łatwo używać .pipe () i .subscribe ().
Jeśli używasz wersji Angular 2, następujący wiersz powinien działać absolutnie dobrze:
LUB
Jeśli nadal napotykasz problem, musisz przejść z:
Nie wolę, abyś używał go bezpośrednio, ponieważ zwiększa to czas ładowania, ponieważ zawiera dużą liczbę operatorów (użytecznych i nieprzydatnych), co nie jest dobrą praktyką zgodnie z normami branżowymi, więc upewnij się najpierw spróbuj użyć wyżej wymienionych linii importujących, a jeśli to nie zadziała, powinieneś wybrać rxjs / Rx
źródło
Mam rozwiązanie tego problemu
Zainstaluj ten pakiet:
następnie zaimportuj tę bibliotekę
w końcu ponownie uruchom projekt jonowy
źródło
Wersja kątowa 6 „0.6.8” rxjs wersja 6 „^ 6.0.0”
to rozwiązanie jest dla:
jak wszyscy wiemy, angular jest rozwijany każdego dnia, więc jest wiele zmian każdego dnia, a to rozwiązanie jest dla Angulara 6 i rxjs 6, które
najpierw pracują z http, należy je zaimportować: w końcu musisz zadeklarować moduł HttpModule w aplikacji. module.ts
i musisz dodać HttpModule do Ngmodule -> importowanie
po drugie, aby pracować z mapą, należy najpierw zaimportować potok:
po trzecie potrzebujesz importu funkcji mapy z:
musisz użyć mapy wewnątrz potoku w następujący sposób:
to działa idealnie, powodzenia!
źródło
Mapa używasz tutaj, nie jest
.map()
w javascript, to Rxjs funkcja map, które działa naObservables
kątowej ...W takim przypadku musisz go zaimportować, jeśli chcesz użyć mapy z danymi wynikowymi ...
Po prostu zaimportuj go w następujący sposób:
źródło
Ponieważ usługa HTTP w angular2 zwraca typ Observable , z katalogu instalacyjnego Angular2 (w moim przypadku „node_modules”), musimy zaimportować funkcję mapowania Observable do twojego komponentu za pomocą usługi http , ponieważ:
źródło
Angular 6 - tylko import „rxjs / Rx” załatwił sprawę
źródło
Po prostu dodaj linię do pliku,
import „rxjs / Rx”;
Spowoduje to zaimportowanie wiązki zależności. Testowane pod kątem 5
źródło
To prawda, że RxJs podzielił swojego operatora mapy w osobny moduł, a teraz musisz zaimportować go jak każdy inny operator.
import rxjs/add/operator/map;
i wszystko będzie dobrze
źródło
Globalny import jest bezpieczny.
import „rxjs / Rx”;
źródło
rozwiąże twój problem
Testowałem to w wersji kątowej 5.2.0 i rxjs 5.5.2
źródło
dzieje się tak, ponieważ używasz rxjs, a funkcja rxjs nie jest statyczna, co oznacza, że nie możesz wywoływać ich bezpośrednio, musisz wywołać metody wewnątrz potoku i zaimportować tę funkcję z biblioteki rxjs
Ale jeśli używasz rxjs -comp, wystarczy zaimportować operatory rxjs -comp
źródło
Próbowałem poniżej poleceń i zostało to naprawione:
źródło
import {map} z 'rxjs / operators';
to działa dla mnie w kanciastym 8
źródło
Dodatkowo, co skomentował @ mlc-mlapis, łączysz operatory do wynajęcia i prototypową metodę łatania. Użyj jednego lub drugiego .
W twoim przypadku tak powinno być
https://stackblitz.com/edit/angular-http-observables-9nchvz?file=app%2Fsw-people.service.ts
źródło