Отсутствуют наблюдаемые методы RxJS 5.0.0-beta.0
У меня возникла проблема с использованием RxJS с Angular 2. Большинство методов, предложенных из файла определения Typescript, не определены на моем объекте Observable, таком как...
![введите описание изображения здесь]()
![введите описание изображения здесь]()
то я понял, что методы не существуют в прототипе Observable.
![введите описание изображения здесь]()
Я знаю, что многое изменилось с версии 4 на 5, так что я что-то пропустил?
Browserify добавила его для меня...
![введите описание изображения здесь]()
Ответы
Ответ 1
Не видя своего реального кода, я не могу точно сказать, что добавить, чтобы исправить его.
Но общая проблема заключается в следующем: RxJS 5 больше не включается в Angular 2 теперь, когда он вступил в бета-стадию. Вам нужно будет импортировать либо нужных вам операторов, либо импортировать их все. Операторы импорта выглядят следующим образом:
import 'rxjs/add/operator/map'; // imports just map
import 'rxjs/add/operator/mergeMap'; // just mergeMap
import 'rxjs/add/operator/switchMap'; // just switchMap
import {delay} from 'rxjs/operator/delay'; // just delay
или как
import 'rxjs/Rx'; // import everything
Чтобы определить путь к вашему желаемому модулю, просмотрите исходное дерево. Каждый импорт с add
добавит свойства к Observable
или Observable.prototype
. Без add
вам нужно сделать import {foo} from 'rxjs/path/to/foo'
.
Вам также необходимо убедиться, что RxJS введен в проект правильно. Что-то вроде этого войдет в ваш файл index.html:
System.config({
map: {
'rxjs': 'node_modules/rxjs' // this tells the app where to find the above import statement code
},
packages: {
'app': {defaultExtension: 'js'}, // if your app in the `app` folder
'rxjs': {defaultExtension: 'js'}
}
});
System.import('app/app'); // main file is `app/app.ts`
Если вы используете Webpack для создания приложения Angular 2, как в этом проекте Github (как и я), тогда вы не нужно, чтобы материал System
, и импорт должен это сделать.
Ответ 2
Да, в Angular 2.0 вам необходимо включить операторы/наблюдаемые данные.
Я делаю это так:
import 'rxjs/operator/map';
import 'rxjs/operator/delay';
import 'rxjs/operator/mergeMap';
import 'rxjs/operator/switchMap';
import 'rxjs/observable/interval';
import 'rxjs/observable/forkJoin';
import 'rxjs/observable/fromEvent';
Однако вам также нужно настроить это в System.js
System.config({
defaultJSExtensions: true,
paths: {
'rxjs/observable/*' : './node_modules/rxjs/add/observable/*.js',
'rxjs/operator/*' : './node_modules/rxjs/add/operator/*.js',
'rxjs/*' : './node_modules/rxjs/*.js'
}
});
Вот рабочий код: https://github.com/thelgevold/angular-2-samples
Ответ 3
У меня есть JSPM-настройка в моем проекте, поэтому добавить rxjs в раздел пути было недостаточно.
jspm добавила следующее в мою конфигурацию SystemJS (раздел карты):
"npm:[email protected]": {
"crypto": "github:jspm/[email protected]",
"es6-promise": "npm:[email protected]",
"es6-shim": "npm:[email protected]",
"process": "github:jspm/[email protected]",
"reflect-metadata": "npm:[email protected]",
"rxjs": "npm:[email protected]",
"zone.js": "npm:[email protected]"
},
Итак, если вы используете jspm, убедитесь, что вы удалили отображение rxjs выше, иначе некоторые файлы rxjs будут загружаться дважды, один раз через jspm_packages и один раз через node_modules.