Angular2 beta.12和RxJs 5 beta.3的可观察错误

时间:2016-03-28 21:15:13

标签: typescript angular asp.net-core-mvc observable rxjs5

您好

我正在使用在VS2015中运行的Angular2 beta 12。当我将rxjs从5.0.0-beta.2更新到beta.3时,我会遇到一系列与我的承诺有关的例外情况。

E.g。

  1. map
  2. 类型中不存在Observable<Response>属性
  3. share
  4. 类型中不存在属性Observable<Response>
  5. 环境模块声明无法指定相对模块名称
  6. Ambient模块不能嵌套在其他模块或名称空间中。
  7. 的package.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"
      }
    }
    

    问题与此代码中的地图功能有关:

    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>
    

    我很难过,希望得到一些帮助。

    谢谢,Dan。

3 个答案:

答案 0 :(得分:15)

关于运算符,您需要手动导入它们,因为它们默认情况下不包含在Observable类中。

为此你可以做到:

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

或(包括所有运营商):

import {Observable} from 'rxjs/Rx';

否则通常您不需要在地图块中将rxjs定义到SystemJS配置中。将相应的捆绑文件包含在脚本标记中就足够了。

答案 1 :(得分:6)

根据Angular的package.json,您应该使用RxJS 5.0.0-beta.2 https://github.com/angular/angular/blob/master/package.json#L37

答案 2 :(得分:5)

对于VS2015,GitHub上列出了此问题的解决方法here

  

目前正在解决的问题是,您可以使用https://raw.githubusercontent.com/Microsoft/TypeScript/Fix8518/lib/typescriptServices.js中的文件替换C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TypeScript \ typescriptServices.js。首先进行本地备份。

重要:请确保您使用的是VS2015更新 2 并使用TypeScript&gt; 1.8.2已安装

(更新1上的文件后,我的VS无法启动)

我使用的是rxjs 5.0.0-beta。 6 btw。