2017-06-20 39 views
0

在我的角度的應用程序,我遇到了麻煩,使用rxjs創建一個可觀察的數組。構造函數的可觀察和靜態方法(的,來自,...)不可用

來源:

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

所以,很顯然,靜態方法不可用。我試圖從這裏兩件事情:

  1. 使用構造函數和創建的可觀察到的(不工作,error Uncaught (in promise): TypeError: Rx_1.Observable is not a constructor
  2. 改變import語句以匹配以下實例(不工作,誤差保持不變)

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", 

編輯 也許愛上了這裏優越的一些問題。我查看了文檔(Pankaj Pankar在這裏的評論中慷慨提供的鏈接),並沒有明確提到ES5,這是我的編譯目標。因此,確保這是不是一個問題,這裏有一些我的設置:

tsconfig.json

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

無低於(或文檔,這是)提到的版本的工作對我來說,所以我想在我的模塊中必須存在不兼容性。

儘管如此,這裏是我發現是工作的唯一途徑 - 但未能如願(大的負荷)

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

return of(1,2,3); 

如果使用rxjs/add/observable/of,你會基本上添加靜態方法,您可以使用以前的方法導入Observable類。

更新:考慮到這在我的本地機器中起作用,它最有可能與成績單或構建過程相關。這裏是我的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

您的打字稿編譯器設置似乎在做竅門。它刪除了「'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

謝謝,這增加了我的理解它應該如何工作。不幸的是,它沒有。注意看我的問題的編輯部分? –