Saya punya masalah dengan HTTP di Angular.
Aku hanya ingin GET
sebuah JSON
daftar dan menunjukkan dalam pandangan.
Kelas layanan
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());
}
}
Dan di HallListComponent
saya memanggil getHalls
metode dari layanan:
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;
});
}
}
Namun, saya mendapat pengecualian:
TypeError: this.http.get (...). Map bukan fungsi di [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{}
komponen aplikasi
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
mengembalikan yang dapat diamati1.8.36
, sedangkan sebagai panduan quickstart ng2 (saat saya menulis ini) menggunakan"typescript": "^2.0.2"
. Meningkatkan TS lang. layanan melalui Ekstensi dan Pembaruan melakukan trik untuk saya. Sementara pembaruan itu sedang diinstal, saya menemukan jawaban SO ini , yang berakhir dengan kesimpulan yang sama.Jawaban:
Saya pikir Anda perlu mengimpor ini:
Atau lebih umum ini jika Anda ingin memiliki lebih banyak metode untuk diamati. PERINGATAN: Ini akan mengimpor semua 50+ operator dan menambahkannya ke aplikasi Anda, sehingga memengaruhi ukuran bundel dan waktu muat Anda.
Lihat masalah ini untuk lebih jelasnya.
sumber
import 'rxjs/add/operator/do'
... Meskipun kita tidak perlu melakukan ini.map()
lagi. Tetapi ini membantu.do()
kasus saya , untuk menyadari bahwa saya secara khusus perlu mengimpornya. Terima kasih! Satu suara dari saya :)Hanya beberapa latar belakang ... Panduan pengembang Server Communication yang baru dicetak (akhirnya) membahas / menyebutkan / menjelaskan ini:
Jadi karena @Thierry sudah menjawab, kita bisa menarik operator yang kita butuhkan:
Atau, jika kita malas kita dapat menarik set lengkap operator. PERINGATAN: ini akan menambahkan semua 50+ operator ke bundel aplikasi Anda, dan akan memengaruhi waktu muat
sumber
Dari rxjs 5.5 dan seterusnya, Anda dapat menggunakan operator pipabel
Apa yang salah dengan
import 'rxjs/add/operator/map';
Ketika kita menggunakan
map
operator pendekatan ini akan ditambal keobservable.prototype
dan menjadi bagian dari objek ini.Jika nanti, Anda memutuskan untuk menghapus
map
operator dari kode yang menangani aliran yang dapat diamati tetapi gagal menghapus pernyataan impor yang sesuai, kode yang mengimplementasikannyamap
tetap menjadi bagian dariObservable.prototype
.Ketika bundler mencoba menghilangkan kode yang tidak digunakan ( alias
tree shaking
), mereka dapat memutuskan untuk menyimpan kodemap
operator di Observable meskipun itu tidak digunakan dalam aplikasi.Solusi -
Pipeable operators
Operator pipa adalah fungsi murni dan tidak menambal Yang Dapat Diamati . Anda dapat mengimpor operator menggunakan sintaks impor ES6
import { map } from "rxjs/operators"
dan kemudian membungkusnya ke dalam fungsipipe()
yang mengambil sejumlah variabel parameter, yaitu operator yang dapat dihubungkan.Sesuatu seperti ini:
sumber
Dengan Angular 5 impor RxJS ditingkatkan.
Dari pada
Kita sekarang bisa
sumber
Penggunaan
Observable.subscribe
secara langsung seharusnya berhasil.sumber
Untuk versi Angular 5 ke atas, garis impor yang diperbarui terlihat seperti:
ATAU
Juga versi ini benar-benar mendukung Pipable Operator sehingga Anda dapat dengan mudah menggunakan .pipe () dan .scribe ().
Jika Anda menggunakan Angular versi 2, maka baris berikut akan berfungsi dengan baik:
ATAU
Jika Anda masih mengalami masalah maka Anda harus pergi dengan:
Saya tidak akan memilih Anda untuk menggunakannya secara langsung karena akan meningkatkan waktu pemuatan, karena memiliki banyak operator di dalamnya (yang berguna dan yang tidak berguna) yang bukan praktik yang baik sesuai dengan norma industri, jadi pastikan Anda mencoba menggunakan jalur impor yang disebutkan di atas terlebih dahulu, dan jika itu tidak berhasil, Anda harus menggunakan rxjs / Rx
sumber
Saya punya solusi untuk masalah ini
Instal paket ini:
lalu impor perpustakaan ini
akhirnya restart proyek ion Anda
sumber
Versi sudut 6 "0.6.8" rxjs versi 6 "^ 6.0.0"
solusi ini untuk:
seperti yang kita semua tahu sudut sedang dikembangkan setiap hari sehingga ada banyak perubahan setiap hari dan solusi ini adalah untuk sudut 6 dan rxjs 6
pertama untuk bekerja dengan http yo Anda harus mengimpornya dari: setelah semua Anda harus mendeklarasikan HttpModule dalam aplikasi. module.ts
dan Anda harus menambahkan HttpModule ke Ngmodule -> impor
kedua untuk bekerja dengan peta, Anda harus terlebih dahulu mengimpor pipa:
ketiga Anda memerlukan fungsi peta impor dari:
Anda harus menggunakan peta di dalam pipa seperti contoh ini:
itu berhasil, semoga berhasil!
sumber
The Peta Anda gunakan di sini, bukan
.map()
di javascript, itu fungsi peta Rxjs yang bekerja diObservables
di sudut ...Jadi dalam hal ini Anda perlu mengimpornya jika Anda ingin menggunakan peta pada data hasil ...
Jadi cukup impor seperti ini:
sumber
Karena layanan Http di angular2 mengembalikan jenis yang Dapat Diobservasi , Dari direktori instalasi Angular2 Anda ('node_modules' dalam kasus saya), Kami perlu mengimpor fungsi peta yang Dapat Diamati dalam komponen Anda menggunakan layanan http , seperti:
sumber
Angular 6 - hanya mengimpor 'rxjs / Rx' yang membantu saya
sumber
Cukup tambahkan baris dalam file Anda,
impor 'rxjs / Rx';
Ini akan mengimpor banyak dependensi. Diuji dalam sudut 5
sumber
Benar, RxJ telah memisahkan operator petanya dalam modul yang terpisah dan sekarang Anda perlu mengimpornya secara eksplisit seperti operator lainnya.
import rxjs/add/operator/map;
dan kamu akan baik-baik saja.
sumber
Impor global aman untuk digunakan.
impor 'rxjs / Rx';
sumber
akan menyelesaikan masalah Anda
Saya mengujinya dalam angular 5.2.0 dan rxjs 5.5.2
sumber
ini terjadi karena Anda menggunakan fungsi rxjs dan rxjs tidak statis yang berarti Anda tidak dapat memanggil mereka secara langsung, Anda harus memanggil metode di dalam pipa dan mengimpor fungsi itu dari perpustakaan rxjs
Tetapi jika Anda menggunakan rxjs-compat maka Anda hanya perlu mengimpor operator rxjs-compat
sumber
Saya mencoba perintah di bawah ini dan diperbaiki:
sumber
impor {peta} dari 'rxjs / operator';
ini bekerja untuk saya di sudut 8
sumber
Ditambah apa yang dikomentari @ mlc-mlapis, Anda mencampurkan operator yang dapat diterima dan metode penambalan prototipe. Gunakan satu atau yang lain .
Untuk kasus Anda seharusnya
https://stackblitz.com/edit/angular-http-observables-9nchvz?file=app%2Fsw-people.service.ts
sumber