2017-06-20 35 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

谢谢,这增加了我的理解它应该如何工作。不幸的是,它没有。注意看我的问题的编辑部分? –