2017-06-20 165 views
0

私の角型アプリケーションでは、観測可能な配列を作成するためにrxjsを使用する際に問題が発生しています。Observableとstaticメソッドのコンストラクタ(of、from ...)が利用できません

出典:

import { Injectable } from "@angular/core"; 
import { Observable } from "rxjs/Rx"; 
import { User } from "../model/user"; 


@Injectable() 
export class UserService { 

    public GetList(): Observable<User[]> { 
     return Observable.of(this.GetDummyData()); 

    } 

    private GetDummyData(): Array<User> { 
     var users: Array<User> = new Array<User>(); 
     users.push(new User(1, "user one", 1, 1000001, true)); 
     users.push(new User(2, "user two", 2, 1000002, false)); 
     users.push(new User(3, "user three", 3, 1000003, true)); 
     return users; 
    } 
} 

これは、次のエラー生成:だから

ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'of' of undefined

を、明らかに、静的メソッドは使用できません。私はここから二つのことを試してみました次に一致するようにimport文を変更し

    1. 使用コンストラクタをと(error Uncaught (in promise): TypeError: Rx_1.Observable is not a constructor、動作していない)、観察のインスタンスを作成します(動作していない、エラーは変わりません)

    import { Observable } from "rxjs/Observable"; 
    import "rxjs/Observable/of"; 
    

    私はこの時間を浪費を取り除くために何ができるかを任意のアイデア?

    使用済みのlibのバージョン:

    "@angular/common": "4.0.1", 
        "@angular/compiler": "4.0.1", 
        "@angular/core": "4.0.1", 
        "@angular/forms": "4.0.1", 
        "@angular/http": "4.0.1", 
        "@angular/platform-browser": "4.0.1", 
        "@angular/platform-browser-dynamic": "4.0.1", 
        "@angular/animations": "4.0.1", 
        "@angular/router": "4.0.1", 
        "core-js": "2.4.1", 
        "reflect-metadata": "0.1.10", 
        "rxjs": "5.4.1", 
        "systemjs": "0.20.11", 
        "zone.js": "0.8.5", 
    

    EDIT たぶんここにいくつかの優れた問題のために落ちます。私はドキュメンテーション(Pankaj Pankarがここのコメントで寛大に提供したリンク)をチェックし、私のコンパイルの対象であるES5の明示的な言及は見ませんでした。だから、ここに私のセットアップのいくつかのより多くのだ、これは問題ではないことを確認してください:以下の(またはドキュメントでは、それがある)が挙げバージョンの

    { 
        "compilerOptions": { 
         "target": "es5", 
         "module": "system", 
         "moduleResolution": "node", 
         "sourceMap": true, 
         "emitDecoratorMetadata": true, 
         "experimentalDecorators": true, 
         "removeComments": false, 
         "noImplicitAny": false, 
         "lib": ["es5", "es2015", "dom" ] 
        } 
    } 
    

    なしが私のために動作しませ

    tsconfig.jsonを、私のモジュールには互換性がなければならないと思います。

    はいえ、ここで私が働いていることが判明唯一の方法です - (前に使用される)が、満足のいかない(あまり負荷)

    import { Observable } from "rxjs/Rx"; 
    import Rx from 'rxjs/Rx'; 
    import 'rxjs/add/observable/of'; 
    
    public GetList(): Observable<User[]> { 
          return Rx.Observable.of(this.GetDummyData()); 
    
         } 
    

    はRx.Observableが定義されていることを意味私の理解することではなく、観察可能ではありません。

  • +2

    はない、 '輸入「rxjs// /観測of'' [ドキュメントリンク](https://github.com/ReactiveX/を追加する必要がありますrxjs#のインストールと使用)? –

    答えて

    3

    は完全なライブラリ(サイズの問題)をロードすること、rxjs/Rxをインポートしないようにしてください。

    通常、これは私がお勧めのアプローチです:

    import { Observable } from 'rxjs/Observable';// Import only the basics 
    import { of } from 'rxjs/observable/of'; // for static methods 
    import 'rxjs/add/operator/catch'; // for operators 
    import 'rxjs/add/operator/map'; 
    

    あなたは次のようにofを使用することができますこの方法:あなたがrxjs/add/observable/ofを使用している場合

    return of(1,2,3); 
    

    、あなたは基本的に静的に追加されますメソッドを使用して、以前のアプローチでObservableクラスにインポートします。

    UPDATE:これは私のローカルマシンで動作すると考えられ、その可能性は最も高い翻訳またはビルドプロセスに関連しています。ここに私のts.config.jsonです(角CLIによって生成された):

    { 
        "compileOnSave": false, 
        "compilerOptions": { 
        "outDir": "./dist/out-tsc", 
        "baseUrl": "src", 
        "sourceMap": true, 
        "declaration": false, 
        "moduleResolution": "node", 
        "emitDecoratorMetadata": true, 
        "experimentalDecorators": true, 
        "target": "es5", 
        "typeRoots": [ 
         "node_modules/@types" 
        ], 
        "lib": [ 
         "es2016", 
         "dom" 
        ] 
        } 
    } 
    
    +0

    説明をいただきありがとうございます - 非常に高く評価されています - 理解しても問題は解決しませんでした。私は、さらなる入力で質問を更新しました。 –

    +1

    私の答えが更新されました。何とか役立つことを願っています –

    +0

    あなたのtypescriptコンパイラの設定はtrick.Itをやっているようですが、それはトリックを行った '' module ":" system "'を取り除いていました。どうもありがとう! –

    1

    は、以下のインポートを試してみてください。

    import { Observable } from "rxjs/Observable"; 
    import 'rxjs/add/observable/of'; 
    
    +0

    それは彼が彼の質問ですでに書いたものです... – Dinistro

    +0

    それは修正されたタイプミスでした。ありがとう! – rajeev

    1

    あなたは'rxjs/add/observable/of'からそれをインポートする必要があります。

    'rxjs/observable/of'からインポートする場合、演算子はObservableクラスに追加されません。演算子でも同じです。

    これはソースで見ることができます。 https://github.com/ReactiveX/rxjs/blob/master/src/add/observable/of.ts#L4

    +0

    ありがとう、これは私の理解にどのように動作する必要が追加されます。残念ながらそれはしません。私の質問の編集セクションを見ていらっしゃいましたか? –

    関連する問題