Угловая 2-функция Http, не отображающая map () и другие функции RxJS
Кто-нибудь знает, были ли какие-либо изменения в http между альфа-45 и альфа-48? Я искал вокруг, и ничего не нашел. Моя проблема в том, что приведенный ниже код отлично работает на Alpha 45. Но теперь, когда я _this.http.post(...).map is not a function
до Alpha 48, я получаю _this.http.post(...).map is not a function
сообщение об ошибке _this.http.post(...).map is not a function
когда я пытаюсь запустите приложение. Странно то, что IntelliSense показывает, что http.post возвращает наблюдаемое. Это означает, что функция карты должна быть доступна. Любая помощь будет оценена по достоинству. Благодаря!
public Authenticate(username: string, password: string): Observable { this.ResetAuthenticationValues(); return Observable.create((subscriber: EventEmitter) => { let body: string = 'grant_type=password&username=' + username + '&password=' + password; let headers = new Headers(); headers.append('Content-Type', 'application/x-www-form-urlencoded'); this.http.post('http://example.com', body, {headers: headers}) .map(res => res.json()) .subscribe( (data: DataResponse) => { if (!data.error) { this.accessToken = {access_token: data.access_token, token_type: data.token_type}; subscriber.next(this.isAuthenticated = true); } else subscriber.error(this.isAuthenticated = false); }, (err) => subscriber.error(err), () => subscriber.complete() ); return () => { }; }); }
- Angular2: Как использовать несколько экземпляров одного и того же сервиса?
- итерация объекта json на Ngfor в угловом 2
- * ng Для запуска бесконечного цикла в угловом2
- Угловое 2 с использованием RxJS - принять (1) против первого ()
- Могут ли ленивые модули использовать один и тот же экземпляр службы, предоставляемой их родителями?
- Угловая обработка HTTP-ответа
- Не удается найти внешний модуль «угловой2 / угловой2» - Angular2 w / Typcript
- Как глубоко наблюдать массив в angularjs?
- Проверка ошибки с наблюдаемыми в сервисах
- Угловое - каковы значения module.id в компоненте?
- Angular2: Как загрузить данные перед рендерингом компонента?
- Отслеживание положения прокрутки и уведомление об этом других компонентах
- Угловой - общий сервис между компонентами не работает
Еще одно обновление (кашель, извините, что забыл этот вариант)
Если вы хотите не добавлять отдельно операторов, вы можете импортировать полный Rx, выполнив
import {Observable, Subject, ReplaySubject, etc...} from 'rxjs/Rx';
У вас будут все операторы 🙂
Обновить альфа 50 (08/12/2015)
Вскоре после того, как альфа-49 была выпущена, они выпустили альфа-50. Эта версия обновила rxjs до альфы 14. Так что вам будет хорошо идти
npm install [email protected] npm install [email protected]
Обновить альфа 49 (08/12/2015)
На данный момент выпущена альфа-49, и это не изменилось, а это значит, что это будет оставаться во времени. Исходный ответ по-прежнему действителен с несколькими изменениями, пути изменены для rjxs, поэтому он должен быть следующим:
System.config({ paths: { 'rxjs/add/observable/*' : 'node_modules/rxjs/add/observable/*.js', 'rxjs/add/operator/*' : 'node_modules/rxjs/add/operator/*.js', 'rxjs/*' : 'node_modules/rxjs/*.js' } }); import 'rxjs/add/operator/map';
Заметка
Эта версия требует именно alpha 13
версии, поэтому, если в вашем package.json
вас уже есть другая версия, вам придется удалить ее, установить angular2, а затем установить rjxs.
Обновить
CHANGELOG был обновлен, чтобы показать это нарушение. Есть комментарий от @jeffbcross в выпуске № 5642, который разъясняет LOT в этом вопросе.
Цитируя часть этого комментария
Модульность стала целью нового проекта RxJS с самого начала, и до недавнего времени мы начали серьезно относиться к составлению операторов вместо того, чтобы полагаться на многоуровневые распределения Rx.
Оригинальный ответ
Фактически произошли изменения в отношении RxJS и Angular2. Итак, теперь для использования таких операторов, как map
вы должны импортировать их отдельно. Вы можете увидеть изменение этого запроса на растяжение . И уже есть вопрос о вашем вопросе.
Я рекомендую вам придерживаться альфы 47. Но всем, кто нуждается и хочет знать, что такое решение, например, в запросе на растяжение, указано, добавить оператора отдельно.
У вас должно быть что-то вроде этого
import {Http, ...} ...; // Component constructor(http: Http) { http.get(...).map() // 'map' doesn't exist! Ouch! }
Чтобы исправить это, добавьте оператор (извините за повторение его столько раз) и настройте пути к rxjs
Заметка
Это должно быть сделано с помощью RxJS alpha 11 или alpha 12 ( не путайте его с @reactivex/rxjs
, теперь это просто rxjs
). Поэтому установите его с помощью
npm install [email protected]
Или просто npm install rxjs
если вы хотите получить последнюю npm install rxjs
, хотя они блокируют ее как альфа-11.
Настройте пути в System.config (обратите внимание, что это моя конфигурация, не обязательно лучшая, и я предполагаю, что вы установили alpha 11)
System.config({ paths: { 'rxjs/observable/*' : 'node_modules/rxjs/observable/*.js', 'rxjs/operators/*' : 'node_modules/rxjs/operators/*.js', 'rxjs/*' : 'node_modules/rxjs/*.js' } });
После того, как вы закончите настройку, вы можете импортировать оператор следующим образом
import 'rxjs/operators/map';
И это все. Вам придется делать это с каждым оператором. Поэтому я повторяю, я рекомендую вам придерживаться альфы 47, как я уже говорил вам в комментарии. Я попытаюсь обновить ответ позже с помощью plnkr.
Если вы хотите использовать бета-версии Angular 2 или будущих релизов в реальном времени, вам нужно сделать две вещи, чтобы заставить это работать.
1) Сначала вам нужно обновить конфигурацию System.config () в index.html, чтобы включить ссылки на RxJS:
System.config({ map: { 'rxjs': 'node_modules/rxjs' }, packages: { 'app': {defaultExtension: 'js'}, // assumes your code sites in `src/app` 'rxjs': {defaultExtension: 'js'} } }); System.import('app/app'); // this assumes your main file is `app.ts` and it sits in the `app` folder.
2) Затем вы можете импортировать map()
и другие (или все) операторы RxJS в ваше приложение с линиями import
в вашем основном файле (app.ts в моем случае):
import 'rxjs/Rx'; // this would import all RxJS operators
Если вы скорее импортируете только map()
чтобы сохранить размер вниз, вы сделаете это вместо этого:
import 'rxjs/add/operator/map';
Им не нужно импортировать их в каждый файл classа. Просто импортируйте их в свой основной файл, чтобы сделать их доступными для всех ваших других компонентов / служб / директив.
Вам нужно импортировать оператор Rx map в свой компонент, например
import 'rxjs/add/operator/map';
Ура!
В отличие от того, что написано выше, я обнаружил, что мне нужно использовать
System.config({ packages: { 'app': {defaultExtension: 'js'}, 'node_modules': {defaultExtension: 'js'} }, paths: { 'rxjs/*' : 'node_modules/rxjs/*.js' } });
Узел node_modules
defaultExtension
был критическим для меня (я не знаю, почему путь rxjs/*
не добавляет .js
но hey ho.)
Это работает от 48 до последних 52.
У меня была эта проблема, и оказалось, что проблема с версией rxjs – angular 2.0.0-rc4 требует rxjs-5.0.0-beta.6, у меня была бета-версия.10 в моей конфигурации jspm!