2017-07-25 23 views
2

私は角2の上に座っているイオン2を使用しています。私はアイテムの配列を作成する必要があります。私はその配列にどれだけ多くのアイテムが入るのか分かりません。Typescriptを使用してダイナミックキーで配列を定義するにはどうすればよいですか?

import { Component } from '@angular/core'; 

import { VgAPI } from 'videogular2/core'; 

@Component({ 
    selector: 'page-class', 
    templateUrl: 'class.html' 
}) 
export class ClassPage { 
    api: any[]; 

    constructor(...){} 

    // Load API when videos are ready 
    onPlayerReady(api: VgAPI, i: any) { 
    this.api[i] = api; 
    } 

} 

onPlayerReadyが呼び出されたときに、私の見解をintializeでビデオプレーヤー:ここ

は簡略化され、私の活字体、です。 iは、そのプレーヤーのIDです(0,1,2、...)。私は、次の取得、残念ながら

this.api[0] = VgAPI (of player 1) 
this.api[1] = VgAPI (of player 2) 
this.api[2] = VgAPI (of player 3) 
this.api[3] = VgAPI (of player 4) 
this.api[4] = VgAPI (of player 5) 

Runtime Error 
Cannot set property '1' of undefined 

私はthis.api[0]が明示的にどこにも定義されていないため、これがあると信じて

は、私は、これはの配列を構築するために期待したいです。しかし、それはどこのアイテムがどれくらいあるかわからないので、問題です。この動作を可能にするために、この配列を適切に定義するにはどうすればよいですか?

+0

変数をコンストラクタで空の配列として設定する必要があります。this.api = []; –

+0

配列には「キー」がありません。配列には「インデックス」があります。すべての配列は定義上動的です。 –

答えて

0

apiあなたは空の配列としてそれを設定する必要があり、undefinedあるので、それはです:

@Component({ 
    selector: 'page-class', 
    templateUrl: 'class.html' 
}) 
export class ClassPage { 
    // initialize as empty array 
    public api: VgAPI[] = []; 

    constructor(...){} 

    // Load API when videos are ready 
    onPlayerReady(api: VgAPI, i: number) { 
    this.api[i] = api; 
    } 
} 
+2

私は誰かがこの回答に投票した理由を知りたいと思います。それに間違いは見られません。 – robbannn

+1

おそらくOPの問題はタイプミスのためです。彼は ''未定義のプロパティ '1'を設定できません。したがって、 'this.api'は未定義であることは明らかです。 'this.api'は決して初期化されていないので、未定義であることは驚くべきことではありません。 –

+0

あまり建設的ではない@トラーザブロ。 'api'はコンストラクタで定義されています - 私は' api [1] 'が定義されていないことを知っています(私の質問ではそう言いました)。コンストラクタで 'any'に設定されている場合です。この答えはその答えです。あなたのコメントは非常に助けになりません、非構造的で間違っています。タイプミスはありませんでした。私は配列として初期化しなければならないことを認識していませんでした。 – Mike

1

Arrays in JavaScript are naturally dynamic in lengthので、あなたは初期化時にサイズを指定する必要はありません。

JavaScript配列の長さもその要素の型も固定されていません。

あなたは配列を初期化していないので、サイズを指定する必要はありません。

すなわち

api: any[];はここで少しクリーンアップと作業JSFiddleapi: any[] = [];

でなければなりません。

interface VgAPI { 
    name: string; 
} 

class ClassPage { 
    private api: VgAPI[] = []; 

    public onPlayerReady = (api: VgAPI, index: number) => { 
    this.api[index] = api; 
    }; 
} 

let classPage = new ClassPage(); 
classPage.onPlayerReady({ name: "foo" }, 1); 
関連する問題