2016-04-29 20 views
3

角2の誤差があり、誤差がどこにあるのかを見つけるのが非常に難しいようです。コンパイル時にエラーは検出されませんが、ページを読み込もうとするとブラウザはそのエラーを表示します。角2誤差

angular2-polyfills.js:349 Error: TypeError: Cannot read property 'prototype' of undefined 
     at __extends (http://localhost:3000/app/repository/award/award.service.js:7:72) 
     at eval (http://localhost:3000/app/repository/award/award.service.js:36:17) 
     at execute (http://localhost:3000/app/repository/award/award.service.js:47:14) 
    Error loading http://localhost:3000/app/main.js 

誰でも正しい方向に向けることができますか?

アプリ/ main.ts:

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

bootstrap(AppComponent, [HTTP_PROVIDERS, ROUTER_PROVIDERS]) 
    .then(success => console.log(`Bootstrap success`)) 
    .catch(error => console.log(error)); 

リポジトリ:

import { Http, Response, Headers } from 'angular2/http'; 
import { Injectable } from 'angular2/core'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/concatMap'; 
import 'rxjs/add/operator/do'; 
import 'rxjs/add/operator/catch'; 
// import { CONFIG } from '../shared/config'; 
import { IEntity } from './ientity'; 

@Injectable() 
export abstract class Repository<T extends IEntity> 
{ 
    protected url = null; 

    constructor(protected _http: Http) {} 

    add(entity: T) { 
    let headers = new Headers(); 
    let body = { 
     name: entity.name 
    }; 

    headers.append('Authorization', 'Basic'); 

    return this._http 
     .post(`${this.url}`, JSON.stringify(body), { 
     headers: headers 
     }) 
     .map(res => res.json()) 
     .catch(this.handleError); 
    } 

    delete(entity: T) { 
    let headers = new Headers(); 
    headers.append('Authorization', 'Basic'); 

    return this._http 
     .delete(`${this.url}/${entity.id}`, { 
     headers: headers 
     }) 
     .catch(this.handleError); 
    } 

    list() { 
    let headers = new Headers(); 
    headers.append('Authorization', 'Basic'); 

    return this._http.get(`${this.url}`, { 
     headers: headers 
    }) 
     .map((response: Response) => 
     <T[]>response.json().data 
    ) 
     // .do(items => console.log(items)) 
     .catch(this.handleError); 
    } 

    get(id: number) { 
    let headers = new Headers(); 
    headers.append('Authorization', 'Basic'); 

    return this._http.get(`${this.url}/${id}`, { 
     headers: headers 
    }) 
     .map((response: Response) => <T>response.json()) 
     .catch(this.handleError); 
    } 


    update(entity: T) { 
    let headers = new Headers(); 

    let body = { 
     name: entity.name 
    }; 

    headers.append('Authorization', 'Basic'); 

    return this._http 
     .put(`${this.url}/${entity.id}`, JSON.stringify(body), { 
     headers: headers 
     }) 
     .map(res => res.json()) 
     // .do(res => console.log(body)) 
     .catch(this.handleError); 
    } 

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

award.service:

import { Http } from 'angular2/http'; 
import { Injectable } from 'angular2/core'; 
import { CONFIG } from '../shared/config'; 
import { Repository } from '../core'; 
import { IAward } from './iaward'; 

@Injectable() 
export class AwardService extends Repository<IAward> 
{ 
    protected url = CONFIG.baseUrls.awards; 

    constructor(protected _http: Http) { 
    super(_http); 
    } 
} 
+0

私たちにあなたのapp/main.tsを教えてください。 –

+0

@DanielKucal上記を参照してください。 – Dblock247

+0

次に、ブートストラップ配列に 'HTTP_PROVIDERS'を置いていますが、どこからでもインポートされません。 'angular2/http';から 'import {HTTP_PROVIDERS} 'を試してみて、それがどこにあるのか教えてください。 –

答えて

4

私は私のプロジェクトに以下を追加することで、これを再現:

export class Subclass extends Base {} 
class Base {} 
次いで

第基本クラスを定義することによって、エラーの周りに働いた:

class Base {} 
export class Subclass extends Base {} 

例:http://plnkr.co/edit/ge5gfckgXMp5ylUhKOEn - 最初に定義される基本クラス、およびエラーなしを動かします。関連しているようですが、複数のファイルのシナリオでは再現できません。

+3

これは、関数とは違って[クラスがJavaScriptで吊り上げられない]ためです(https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes#Hoisting)。 'Base'を拡張しようとするとき、そのクラスは実際にはまだ存在しません。この仕様ではReferenceErrorが発生するはずですが、このコードはネイティブクラスを使用するのではなくトランケル化されているため、代わりにもっと混乱しやすいエラーが発生します。 –