12

私はAngular2で遊んでいます。基本として、angular.ioページのクイックスタートプロジェクトを使用しました。

ItemServiceすべてが正常に動作しているように見えますが、サービス ( ) を自分に挿入しようとするとすぐに、AppComponent次の例外が発生します。

Token(ComponentRef)! のインスタンス化中にエラーが発生しました。元のエラー: AppComponent のすべてのパラメーターを解決できません。すべてに有効な型または注釈があることを確認してください。

インターネットで同様の問題を見たことがあります (この投稿などのスタックオーバーフローを含む) が、どれも私の問題を解決していないようです。何が問題なのか、何らかの考えを持っている体はありますか?

注入可能なクラスを - 注釈で装飾するいくつかのソリューション (たとえば、Angular2 リポジトリのもの) も見てきましたInjectable。ただし、 で定義されていないため、これは機能しませんangular.d.ts。間違ったバージョンを使用していますか?

次の Plunker で私の解決策を見つけることができます: http://plnkr.co/edit/7kK1BtcuEHjaspwLTmsg

記録として、私の 2 つのファイルを以下に示します。app.jsPlunker の は、以下の TypeScript ファイルから生成された JavaScript ファイルであることに注意してください。例外は常に同じです。

index.html:

<html>
    <head>
        <title>Testing Angular2</title>
        <script src="https://github.jspm.io/jmcriffey/bower-traceur-runtime@0.0.87/traceur-runtime.js"></script>
        <script src="https://jspm.io/system@0.16.js"></script>
        <script src="https://code.angularjs.org/2.0.0-alpha.23/angular2.dev.js"></script>
    </head>
    <body>
        <app></app>
        <script>
            System.import('js/app');
        </script>
    </body>
</html> 

js/app.ts:

/// <reference path="../../typings/angular2/angular2.d.ts" />

import {Component, View, bootstrap, For, If} from "angular2/angular2";

class Item {
    id:number;
    name:string;

    constructor(id:number, name:string) {
        this.id = id;
        this.name = name;
    }
}

class ItemService {
    getItems() {
        return [
            new Item(1, "Bill"),
            new Item(2, "Bob"),
            new Item(3, "Fred")
        ];
    }
}

@Component({
    selector: 'app',
    injectables: [ItemService]
})
@View({
    template: `<h1>Testing Angular2</h1>
               <ul>
                 <li *for="#item of items">
                   {{item.id}}: {{item.name}} |
                   <a href="javascript:void(0);" (click)="toggleSelected(item);">
                     {{selectedItem == item ? "unselect" : "select"}}
                   </a>
                 </li>
               </ul>
               <item-details *if="selectedItem" [item]="selectedItem"></item-details>`,
    directives: [For, If, DetailComponent]
})
class AppComponent {
    items:Item[];
    selectedItem:Item;

    constructor(itemService:ItemService) {
        this.items = itemService.getItems();
    }

    toggleSelected(item) {
        this.selectedItem = this.selectedItem == item ? null : item;
    }
}

@Component({
    selector: 'item-details',
    properties: {
        item: "item"
    }
})
@View({
    template: `<span>You selected {{item.name}}</span>`
})
class DetailComponent {
    item:Item;
}

bootstrap(AppComponent);

アイデアをお寄せいただきありがとうございます。

4

3 に答える 3

3

私のセットアップ: TypeScript 1.5 ベータ版 (ES5 にコンパイル) と node/npm を使用して、Windows で WebStorm 10.0.2 を実行しています。

PSL の助けのおかげで、セットアップにいくつかの問題が見つかりました。クラス定義の順序など、コードとは関係ありませんでした。記録のために、私が抱えていた問題を要約したいと思います。それらのほとんどは PSL によって言及されていますが、WebStorm のコンパイラーに関連するなど、他の人も同じ問題を抱えている可能性があります。

私が抱えていた問題は次のとおりです。

  • npm経由でインストールされたTypeScript 1.5を使用するようにWebStormを構成しましたが、古いバージョン(1.3)が使用されました。これは、システムにもインストールされ(Visual Studioと一緒だと思います)、%path%変数に登録されていたためです。

  • TypeScript に「カスタム コンパイラ バージョン」を使用するように WebStorm を構成しました (設定/言語とフレームワーク/TypeScript 内)。引数は次のとおりです-emitDecoratorMetadata -m commonjs -t es5 -sourceMap。これはうまくいきません..WebStormの問題に関連しているかどうかはわかりません。フラグがない-emitDecoratorMetadataとコンパイルされましたが、injectables機能しませんでした。

    [更新、2015 年 6 月 9 日: はい、WebStormの問題に関連しています]

  • ただし、-emitDecoratorMetadataAngular2 で動作させるには -flag が必要injectablesです。

  • 私の解決策は、次の引数を使用して、(「組み込みコンパイラ」関数を使用する代わりに) WebStorm にカスタム「ファイルウォッチャー」を追加することでした。-emitDecoratorMetadata -m commonjs -t es5 --sourceMap $FilePath$

Angular2、TypeScript 1.5、および WebStorm を使用して学んだ教訓:

  • TypeScript 1.5 が本当に ts ファイルのコンパイルに使用されるバージョンであることを確認してください (例: IDE 内)。

  • が指定されていることを確認し-emitDecoratorMetadataます。

  • クラスが特定の順序または独自のファイルなどで定義されている場合、違いはありません。-> 順序は重要です! クラス/コンポーネントを別のファイルに分割すると、問題が解決し、一般に、より保守しやすいファイルにつながります。

貴重な情報を提供してくれた PSL に改めて感謝します。

于 2015-05-19T16:33:12.157 に答える
2

私は同じ問題に直面していました。以下は解決策でした:

  1. --emitDecoratorMetadata が tsc にありませんでした
  2. 同じファイルからサービスを注入していた場合、失敗していましたが、サービスを別のファイルに配置し、それをインポートすると、機能し始めました。おそらく私が使用していたAngular2バージョンのバグです。
于 2015-08-01T11:06:18.080 に答える