J'ai un problème avec HTTP dans Angular.
Je veux juste GET
une JSON
liste et la montrer dans la vue.
Classe de service
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());
}
}
Et dans le HallListComponent
j'appelle la getHalls
méthode du service:
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;
});
}
}
Cependant, j'ai eu une exception:
TypeError: this.http.get (...). Map n'est pas une fonction dans [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
service retourne un observable1.8.36
, alors que le guide de démarrage rapide ng2 (au moment où j'écris ceci) utilise"typescript": "^2.0.2"
. Mise à niveau du TS lang. le service via les extensions et les mises à jour a fait l'affaire pour moi. Pendant l'installation de cette mise à jour, je suis tombé sur cette réponse SO , qui se termine par la même conclusion.Réponses:
Je pense que vous devez importer ceci:
Ou plus généralement ceci si vous voulez avoir plus de méthodes pour les observables. AVERTISSEMENT: cela importera tous les 50+ opérateurs et les ajoutera à votre application, affectant ainsi la taille de votre bundle et les temps de chargement.
Consultez ce numéro pour plus de détails.
la source
import 'rxjs/add/operator/do'
... Bien que nous n'ayons plus besoin de faire ça.map()
. Mais cela a aidé mon.do()
cas, à réaliser que je dois spécifiquement l'importer. Je vous remercie! Un voteJuste un peu d'histoire ... Le tout nouveau guide de développement Server Communication (enfin) discute / mentionne / explique ceci:
Donc, comme @Thierry a déjà répondu, nous pouvons simplement attirer les opérateurs dont nous avons besoin:
Ou, si nous sommes paresseux, nous pouvons tirer l'ensemble complet des opérateurs. AVERTISSEMENT: cela ajoutera tous les 50+ opérateurs à votre ensemble d'applications et affectera les temps de chargement
la source
À partir de rxjs 5.5 , vous pouvez utiliser les opérateurs canalisables
Quel est le problème avec le
import 'rxjs/add/operator/map';
Lorsque nous utilisons cette approche, l'
map
opérateur est corrigéobservable.prototype
et devient une partie de cet objet.Si plus tard, vous décidez de supprimer l'
map
opérateur du code qui gère le flux observable mais ne supprimez pas l'instruction d'importation correspondante, le code qui implémentemap
reste une partie de laObservable.prototype
.Lorsque les bundlers tentent d'éliminer le code inutilisé ( aka
tree shaking
), ils peuvent décider de conserver le code dumap
opérateur dans l'Observable même s'il n'est pas utilisé dans l'application.Solution -
Pipeable operators
Les opérateurs canalisables sont de simples fonctions et ne corrigent pas l' Observable . Vous pouvez importer des opérateurs à l'aide de la syntaxe d'importation ES6
import { map } from "rxjs/operators"
, puis les encapsuler dans une fonctionpipe()
qui prend un nombre variable de paramètres, c'est-à-dire des opérateurs chaînables.Quelque chose comme ça:
la source
Avec Angular 5, l'importation RxJS est améliorée.
Au lieu de
Nous pouvons maintenant
la source
L'utilisation
Observable.subscribe
directe devrait fonctionner.la source
Pour les versions angulaires 5 et supérieures, la ligne d'importation mise à jour ressemble à:
OU
De plus, ces versions prennent totalement en charge les opérateurs pipables afin que vous puissiez facilement utiliser .pipe () et .subscribe ().
Si vous utilisez la version angulaire 2, la ligne suivante devrait fonctionner parfaitement:
OU
Si vous rencontrez toujours un problème, vous devez choisir:
Je ne préférerais pas que vous l'utilisiez directement car il augmente le temps de chargement, car il contient un grand nombre d'opérateurs (utiles et inutiles), ce qui n'est pas une bonne pratique selon les normes de l'industrie, alors assurez-vous vous essayez d'abord d'utiliser les lignes d'importation mentionnées ci-dessus, et si cela ne fonctionne pas, vous devriez opter pour rxjs / Rx
la source
J'ai une solution à ce problème
Installez ce package:
puis importez cette bibliothèque
redémarrez enfin votre projet ionique puis
la source
Version angulaire 6 "0.6.8" rxjs version 6 "^ 6.0.0"
cette solution est pour:
comme nous le savons tous, angular est développé tous les jours, donc il y a beaucoup de changements chaque jour et cette solution est pour angular 6 et rxjs 6 d'
abord pour travailler avec http, vous devez l'importer: après tout, vous devez déclarer le HttpModule dans l'application. module.ts
et vous devez ajouter HttpModule à Ngmodule -> importations
deuxième pour travailler avec la carte, vous devez d'abord importer le tuyau:
Troisièmement, vous devez importer la fonction de carte à partir de:
vous devez utiliser map inside pipe comme cet exemple:
ça marche parfaitement bonne chance!
la source
La carte que vous utilisez ici, n'est pas
.map()
en javascript, c'est la fonction de carte Rxjs qui fonctionne surObservables
Angular ...Donc, dans ce cas, vous devez l'importer si vous souhaitez utiliser la carte sur les données de résultat ...
Il suffit donc de l'importer comme ceci:
la source
Étant donné que le service Http dans angular2 renvoie un type Observable , à partir de votre répertoire d'installation Angular2 ('node_modules' dans mon cas), nous devons importer la fonction de carte de l'Observable dans votre composant en utilisant le service http , comme:
la source
Angular 6 - seule l'importation 'rxjs / Rx' a fait l'affaire pour moi
la source
Ajoutez simplement la ligne dans votre fichier,
importer 'rxjs / Rx';
Il importera un tas de dépendances.Testé en angulaire 5
la source
Certes, RxJs a séparé son opérateur de carte dans un module séparé et vous devez maintenant l'impliquer explicitement comme n'importe quel autre opérateur.
import rxjs/add/operator/map;
et tout ira bien.
la source
L'importation mondiale est sûre.
importer 'rxjs / Rx';
la source
va résoudre votre problème
Je l'ai testé dans angular 5.2.0 et rxjs 5.5.2
la source
cela se produit parce que vous utilisez les rxjs et que la fonction dans rxjs n'est pas statique, ce qui signifie que vous ne pouvez pas les appeler directement, vous devez appeler les méthodes à l'intérieur du canal et importer cette fonction depuis la bibliothèque rxjs
Mais si vous utilisez rxjs-compat, il vous suffit d'importer les opérateurs rxjs-compat
la source
J'ai essayé les commandes ci-dessous et cela se corrige:
la source
importer {map} depuis 'rxjs / operators';
cela fonctionne pour moi en angulaire 8
la source
De plus, ce que @ mlc-mlapis a commenté, vous mélangez les opérateurs locables et la méthode de correction de prototype. Utilisez l'un ou l'autre .
Pour votre cas, il devrait être
https://stackblitz.com/edit/angular-http-observables-9nchvz?file=app%2Fsw-people.service.ts
la source