Tengo un problema con HTTP en Angular.
Solo quiero GET
una JSON
lista y mostrarla en la vista.
Clase de servicio
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());
}
}
Y en el HallListComponent
llamo al getHalls
método desde el servicio:
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;
});
}
}
Sin embargo, obtuve una excepción:
TypeError: this.http.get (...). Map no es una función en [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
servicio devuelve un observable1.8.36
, mientras que la guía de inicio rápido ng2 (mientras escribo esto) está usando"typescript": "^2.0.2"
. Actualización del TS lang. el servicio a través de Extensiones y Actualizaciones me sirvió. Mientras se instalaba esa actualización, encontré esta respuesta SO , que termina con la misma conclusión.Respuestas:
Creo que necesitas importar esto:
O, más generalmente, esto si desea tener más métodos para observables. ADVERTENCIA: Esto importará los más de 50 operadores y los agregará a su aplicación, lo que afectará el tamaño de su paquete y los tiempos de carga.
Vea este número para más detalles.
fuente
import 'rxjs/add/operator/do'
... Aunque ya no tenemos que hacer esto por.map()
más tiempo. Pero esto ayudó a mi.do()
caso, para darme cuenta de que específicamente necesito importarlo. ¡Gracias! Un voto mío :)Solo algunos antecedentes ... La nueva guía de desarrollo de Server Communication (finalmente) discute / menciona / explica esto:
Entonces, como @Thierry ya respondió, podemos atraer a los operadores que necesitamos:
O, si somos flojos, podemos atraer al conjunto completo de operadores. ADVERTENCIA: esto agregará los más de 50 operadores a su paquete de aplicaciones y afectará los tiempos de carga
fuente
A partir de rxjs 5.5 en adelante, puede usar los operadores canalizables
¿Qué está mal con el
import 'rxjs/add/operator/map';
Cuando usamos este enfoque, el
map
operador será parcheadoobservable.prototype
y se convertirá en parte de este objeto.Si más adelante, decide eliminar el
map
operador del código que maneja la secuencia observable pero no elimina la instrucción de importación correspondiente, el código que implementamap
sigue siendo parte de laObservable.prototype
.Cuando los agrupadores intentan eliminar el código no utilizado ( también conocido como
tree shaking
), pueden decidir mantener el código delmap
operador en el Observable aunque no se esté utilizando en la aplicación.solución -
Pipeable operators
Los operadores canalizables son funciones puras y no parchean el Observable . Puede importar operadores utilizando la sintaxis de importación ES6
import { map } from "rxjs/operators"
y luego envolverlos en una funciónpipe()
que tome un número variable de parámetros, es decir, operadores encadenables.Algo como esto:
fuente
Con Angular 5 se mejora la importación de RxJS.
En vez de
Ahora podemos
fuente
Usar
Observable.subscribe
directamente debería funcionar.fuente
Para las versiones angulares 5 y superiores, la línea de importación actualizada se ve así:
O
Además, estas versiones son totalmente compatibles con los operadores Pipable para que pueda usar fácilmente .pipe () y .subscribe ().
Si está utilizando Angular versión 2, entonces la siguiente línea debería funcionar absolutamente bien:
O
Si aún encuentra un problema, debe ir con:
No preferiré que lo use directamente porque aumenta el tiempo de carga, ya que tiene una gran cantidad de operadores (útiles y no útiles), lo que no es una buena práctica de acuerdo con las normas de la industria, así que asegúrese de intente usar primero las líneas de importación mencionadas anteriormente, y si eso no funciona, entonces debería usar rxjs / Rx
fuente
Tengo una solución a este problema.
Instala este paquete:
luego importe esta biblioteca
finalmente reinicie su proyecto iónico luego
fuente
Versión angular 6 "0.6.8" rxjs versión 6 "^ 6.0.0"
esta solución es para:
como todos sabemos, angular se está desarrollando todos los días, por lo que hay muchos cambios todos los días y esta solución es para que angular 6 y rxjs 6 trabajen
primero con http, debe importarlo: después de todo, debe declarar el HttpModule en la aplicación. module.ts
y tienes que agregar HttpModule a Ngmodule -> importaciones
segundo para trabajar con el mapa, primero debe importar la tubería:
tercero, necesita importar la función de mapa desde:
tienes que usar map inside pipe como este ejemplo:
eso funciona perfectamente buena suerte!
fuente
El mapa que usa aquí, no está
.map()
en javascript, es la función de mapa Rxjs que está trabajando enObservables
en Angular ...Entonces, en ese caso, debe importarlo si desea usar el mapa en los datos de resultados ...
Así que simplemente impórtalo así:
fuente
Ya que servicio Http en angular2 devuelve un tipo Observable , desde su directorio de instalación Angular2 ('node_modules' en mi caso), necesitamos importar la función de mapa del Observable en su componente usando el servicio http , como:
fuente
Angular 6: solo importar 'rxjs / Rx' fue el truco para mí
fuente
Simplemente agregue la línea en su archivo,
importar 'rxjs / Rx';
Importará un montón de dependencias. Probado en angular 5
fuente
Es cierto que RxJs ha separado su operador de mapa en un módulo separado y ahora necesita importarlo explícitamente como cualquier otro operador.
import rxjs/add/operator/map;
y estarás bien
fuente
La importación global es segura.
importar 'rxjs / Rx';
fuente
resolverá tu problema
Lo probé en angular 5.2.0 y rxjs 5.5.2
fuente
esto está sucediendo porque está utilizando los rxjs y en la función rxjs no son estáticos, lo que significa que no puede llamarlos directamente, debe llamar a los métodos dentro de la tubería e importar esa función desde la biblioteca rxjs
Pero si está utilizando rxjs-compat, entonces solo necesita importar los operadores rxjs-compat
fuente
Intenté los siguientes comandos y se solucionó:
fuente
importar {mapa} desde 'rxjs / operadores';
esto funciona para mí en angular 8
fuente
Además de lo que comentó @ mlc-mlapis, estás mezclando operadores que se pueden alquilar y el método de parcheo prototipo. Use uno u otro .
Para su caso debería ser
https://stackblitz.com/edit/angular-http-observables-9nchvz?file=app%2Fsw-people.service.ts
fuente