8

こんにちは、

VS2015 で実行されている Angular2 ベータ 12 を使用しています。rxjs を 5.0.0-beta.2 から beta.3 に更新すると、通常は約束に関連するさまざまな例外が発生します。

例えば

  1. 型にプロパティmapが存在しませんObservable<Response>
  2. タイプにプロパティshareが存在しませんObservable<Response>
  3. アンビエント モジュールの宣言では、相対モジュール名を指定できません
  4. アンビエント モジュールを他のモジュールまたは名前空間にネストすることはできません。

パッケージ.json

{
  "name": "ASP.NET",
  "version": "0.0.0",
  "scripts": {
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "lite": "lite-server",
    "start": "concurrent \"npm run tsc:w\" \"npm run lite\" "
  },
  "dependencies": {
    "angular2": "2.0.0-beta.12",
    "systemjs": "0.19.24",
    "es6-promise": "3.1.2",
    "es6-shim": "0.35.0",
    "reflect-metadata": "0.1.3",
    "rxjs": "5.0.0-beta.3", // beta.2 allowed project to build
    "zone.js":"0.6.6"
  },
  "devDependencies": {
    "gulp": "3.9.1",
    "gulp-concat": "2.6.0",
    "gulp-cssmin": "0.1.7",
    "gulp-uglify": "1.5.3",
    "rimraf": "2.2.8",
    "concurrently": "2.0.0",
    "lite-server": "2.1.0",
    "typescript": "1.8.9"
  }
}

問題は、このコードの map 関数に関連しています:

import {Injectable} from 'angular2/core';
import {Http, Response} from 'angular2/http';
import {Headers, RequestOptions} from 'angular2/http';
import {Observable}     from 'rxjs/Observable';

import {ApplicationVM} from '../../Applications/ViewModels/Application.ViewModel';

@Injectable()
export class ApplicationService {
    constructor(private http: Http) { }

    private _serviceUrl = './../api/';

    getApplications() {
        return this.http.get(this._serviceUrl + "applications/active")
            .map(res => <ApplicationVM[]>res.json())
           // .map((res: Response) => res.json())
            .do(data => console.log(data)) // eyeball results in the console
            .catch(this.handleError);
    }

    private handleError(error: Response) {
        console.log(error);
        return Observable.throw(error.json().error || 'Server error');
    }

}

別の場合、問題はshare()

 constructor(private _http: Http) {
     console.log("constructor");
     this.menulist$ = new Observable(observer => this._menulistObserver = observer).share();
     this.menuState$ = new Observable(observer => this._menuStateObserver = observer).share();
     this.menuWidth$ = new Observable(observer => this._menuWidthObserver = observer).share();}

これは重要かもしれないと思います - rxjs ファイルの範囲には、相対参照のために赤の下線が引かれています../../Observable(以下の例は interval.d.ts にあります)

import { IntervalObservable } from '../../observable/IntervalObservable';
declare module '../../Observable' {
    namespace Observable {
        let interval: typeof IntervalObservable.create;
    }
}

私のboot.ts

///<reference path="./../node_modules/angular2/typings/browser.d.ts"/>
import {bootstrap}      from 'angular2/platform/browser';
import {ROUTER_PROVIDERS} from 'angular2/router';
import {AppComponent} from './app.component';
import {HTTP_PROVIDERS}    from 'angular2/http';
import 'rxjs/Rx'; // kitchen sink

// Bootstrap the application and reference the required directives
bootstrap(AppComponent, [ROUTER_PROVIDERS, HTTP_PROVIDERS]);

私のhtmlページ

 <!-- 1. Load libraries -->
    <script src="~/nodelibs/angular2/bundles/angular2-polyfills.js"></script>
    <script src="~/nodelibs/systemjs/system.src.js"></script>
    <script src="~/nodelibs/typescript/lib/typescript.js"></script>
    <script src="~/nodelibs/rxjs/bundles/Rx.js"></script>
    <script src="~/nodelibs/angular2/bundles/angular2.dev.js"></script>

    <script src="~/nodelibs/angular2/bundles/router.dev.js"></script>
    <script src="~/nodelibs/angular2/bundles/http.dev.js"></script>


    <!-- 2. Configure SystemJS -->
    <script>

    var rootPath = "@Url.Content("~/")";

    System.config({
        //transpiler: 'typescript',
        //typescriptOptions: { emitDecoratorMetadata: true },
        baseURL: rootPath,
        defaultJSExtensions: true,
        packages: {
            app: {
                //format: 'register',
                defaultExtension: 'js'
            }, map: {

                'rxjs/observable/*' : 'nodelibs/rxjs/observable/*.js',
                'rxjs/operators/*' : 'nodelibs/rxjs/operators/*.js',
                'rxjs/*' : 'nodelibs/rxjs/*.js'
            }
        }
    });
    System.import("/app/boot.js")
          .then(null, console.error.bind(console));

    </script>

私は困惑しており、いくつかの支援をいただければ幸いです。

ありがとう、ダン。

4

3 に答える 3

15

オペレーターに関しては、デフォルトでは Observable クラスに含まれていないため、手動でインポートする必要があります。

これには、次のいずれかを実行できます。

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/share';

または (すべての演算子を含める場合):

import {Observable} from 'rxjs/Rx';

それ以外の場合、通常、map ブロックの SystemJS 構成に rxjs を定義する必要はありません。対応するバンドル ファイルをスクリプト タグに含めるだけで十分です。

于 2016-03-28T22:40:01.543 に答える
6

Angular の package.json によると、正確に RxJS 5.0.0-beta.2 https://github.com/angular/angular/blob/master/package.json#L37を使用する必要があります

于 2016-03-29T15:28:26.247 に答える
5

VS2015 の場合、この問題の回避策が GitHub にリストされています。

現時点での回避策として、C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TypeScript\typescriptServices.js をhttps://raw.githubusercontent.com/のファイルに置き換えることができます。 Microsoft/TypeScript/Fix8518/lib/typescriptServices.js . ただし、最初にローカルバックアップを取ります。

重要: VS2015 Update 2を使用していて、TypeScript > 1.8.2 がインストールされていることを確認してください。

(Update 1でファイルを置き換えた後、私のVSは起動しませんでした)

rxjs 5.0.0-beta を使用しています。ところで6 。

于 2016-06-01T06:50:51.460 に答える