Отсутствуют наблюдаемые методы 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.