У меня проблема с HTTP в Angular.
Я просто хочу , чтобы GET
в JSON
список и показать его в представлении.
Сервисный класс
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());
}
}
И в HallListComponent
я вызываю getHalls
метод из службы:
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;
});
}
}
Однако я получил исключение:
Ошибка типа: this.http.get (...). Map не является функцией в [null]
зал-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
сервис возвращает наблюдаемое1.8.36
работало, тогда как в руководстве по быстрому старту ng2 (как я пишу это) используется"typescript": "^2.0.2"
. Обновление TS lang. сервис через расширения и обновления сделал свое дело для меня. Во время установки этого обновления я наткнулся на этот SO-ответ , который заканчивается тем же выводом.Ответы:
Я думаю, что вам нужно импортировать это:
Или, в общем, это, если вы хотите иметь больше методов для наблюдаемых. ВНИМАНИЕ: Это импортирует все более 50 операторов и добавляет их в ваше приложение, что влияет на размер вашего пакета и время загрузки.
Смотрите эту проблему для более подробной информации.
источник
import 'rxjs/add/operator/do'
... Пока нам больше не нужно это делать.map()
. Но это помогло моему.do()
делу, чтобы понять, что мне нужно импортировать его. Спасибо! Один голос от меня :)Просто немного предыстории ... Недавно разработанное руководство по разработке серверных коммуникаций (наконец) обсуждает / упоминает / объясняет это:
Так как @Thierry уже ответил, мы можем просто добавить нужные нам операторы:
Или, если мы ленивы, мы можем использовать полный набор операторов. ВНИМАНИЕ: это добавит все 50+ операторов в ваш пакет приложений и повлияет на время загрузки
источник
Начиная с версии rxjs 5.5 , вы можете использовать конвейерные операторы
Что не так с
import 'rxjs/add/operator/map';
Когда мы используем этот подход,
map
оператор будет исправленobservable.prototype
и станет частью этого объекта.Если позднее вы решите удалить
map
оператор из кода, который обрабатывает наблюдаемый поток, но не удаляет соответствующий оператор импорта, реализующий кодmap
остается частьюObservable.prototype
.Когда сборщики пытаются удалить неиспользуемый код ( он же
tree shaking
), они могут решить сохранить кодmap
оператора в Observable, даже если он не используется в приложении.Решение -
Pipeable operators
Трубные операторы являются чистыми функциями и не исправляют Observable . Вы можете импортировать операторы, используя синтаксис импорта ES6,
import { map } from "rxjs/operators"
а затем обернуть их в функцию,pipe()
которая принимает переменное число параметров, то есть цепочечные операторы.Что-то вроде этого:
источник
С Angular 5 улучшен импорт RxJS.
Вместо того
Мы можем сейчас
источник
Использование
Observable.subscribe
напрямую должно работать.источник
Для версий Angular 5 и выше обновленная строка импорта выглядит следующим образом:
ИЛИ
Также эти версии полностью поддерживают Pipable Operators, поэтому вы можете легко использовать .pipe () и .subscribe ().
Если вы используете Angular версии 2, то следующая строка должна работать абсолютно нормально:
ИЛИ
Если вы все еще сталкиваетесь с проблемой, тогда вы должны пойти с:
Я не предпочту, чтобы вы использовали его напрямую, потому что он увеличивает время загрузки, поскольку в нем большое количество операторов (полезных и бесполезных), что не является хорошей практикой в соответствии с отраслевыми нормами, поэтому убедитесь, что сначала вы пытаетесь использовать вышеупомянутые строки импорта, и если это не сработает, тогда вам следует перейти на rxjs / Rx
источник
У меня есть решение этой проблемы
Установите этот пакет:
затем импортируйте эту библиотеку
наконец перезапустите ваш ионный проект, то
источник
Угловая версия 6 "0.6.8" rxjs версия 6 "^ 6.0.0"
это решение для:
как мы все знаем, angular разрабатывается каждый день, поэтому каждый день происходит множество изменений, и это решение предназначено для angular 6 и rxjs 6, которые в
первую очередь работают с http, вам следует импортировать его из: в конце концов, вы должны объявить HttpModule в приложении. module.ts
и вы должны добавить HttpModule в Ngmodule -> импорт
Во-вторых, для работы с картой вы должны сначала импортировать канал:
в-третьих, вам нужно импортировать функцию карты из:
Вы должны использовать карту внутри трубы, как этот пример:
это прекрасно работает удачи!
источник
Карту вы используете здесь, не
.map()
в JavaScript, это Rxjs карта функция , которая работает наObservables
в угловых ...Так что в этом случае вам нужно импортировать его, если вы хотите использовать карту на данных результатов ...
Просто импортируйте это так:
источник
Так как служба Http в angular2 возвращает тип Observable , из вашего установочного каталога Angular2 (в моем случае это «node_modules»), нам нужно импортировать функцию отображения Observable в ваш компонент, используя службу http , как:
источник
Angular 6 - только импорт 'rxjs / Rx' помог мне
источник
Просто добавьте строку в ваш файл,
импорт 'rxjs / Rx';
Он будет импортировать кучу зависимостей. Испытано в угловых 5
источник
Правда, RxJs разделил свой оператор отображения в отдельном модуле, и теперь вам нужно экспортировать его подробно, как любой другой оператор.
import rxjs/add/operator/map;
и у тебя все будет хорошо.
источник
Глобальный импорт безопасен.
импорт 'rxjs / Rx';
источник
разрешит вашу проблему
Я проверял это в угловых 5.2.0 и rxjs 5.5.2
источник
это происходит потому, что вы используете функции rxjs и в rxjs не являются статичными, что означает, что вы не можете вызывать их напрямую, вы должны вызывать методы внутри канала и импортировать эту функцию из библиотеки rxjs
Но если вы используете rxjs-compat, вам просто нужно импортировать операторы rxjs-compat
источник
Я попробовал ниже команды, и это исправлено:
источник
import {map} из 'rxjs / operator';
это работает для меня в угловых 8
источник
Плюс к тому, что прокомментировал @ mlc-mlapis, вы смешиваете операторы lettable и метод исправления прототипа. Используйте один или другой .
Для вашего случая это должно быть
https://stackblitz.com/edit/angular-http-observables-9nchvz?file=app%2Fsw-people.service.ts
источник