0

私はAngularでアプリを書いており、それぞれがビューと呼ばれるカスタムサービスの配列を持つワークブックと呼ばれるカスタムサービスの配列を作成しています。単純な for ループで配列を埋めましたが、何らかの理由で予期しない結果が生じています。

最初の反復の後、配列には 1 つのワークブックがあります。 Workbook 1

2 番目の後に、workbook 2 という名前の 2 つのワークブック:Workbook 2 Workbook 2

3 回目以降:Workbook 3 Workbook 3 Workbook 3

等々。これはどのように起こっているのでしょうか?ワークブックを作成して配列に追加するコードの簡略化されたバージョンを次に示します。

for (var i = 0; i < 3; i++) {
    var workbook = Workbook;
    workbook.setTitle("workbook " + (i + 1));
    for (var j = 0; j <2; j++ ) {
        var view = View;
        view.setTitle("view " + (j + 1));
        workbook.addView(view);
    }

    workbooks[i] = workbook;

    //this next for loop can be used to print the array as described    
    for (var k = 0; k < workbooks.length; k++) {
        console.log(workbooks[k].getTitle());
    }
}

return workbooks;

これはどのように起こりますか?i 番目のワークブックにタイトルが割り当てられ、配列の i 番目のスポットに割り当てられます。が 2 の場合i、どのように呼ばWorkbook 3れるワークブックを配列の 0 番目と 1 番目のスポット、および 2 番目のスポットに割り当てることができますか?

参考までに、アプリからの関連コードへのプランカーを次に示します。ありがとう!

4

3 に答える 3

1

配列内のすべてのスポットに i 番目のワークブックを割り当てるのではなく、それぞれに同じワークブックを割り当ててから、タイトルを更新します。あなたが作る必要があります

var workbook = Workbook;

これに

var workbook = new Workbook;
于 2013-07-26T23:03:22.233 に答える
0

さて、最初の問題:

for (var i = 0; i < 3; i++) {
var workbook = Workbook;
workbook.setTitle("workbook " + (i + 1));

このループのたびに、変数 'workbook' を再作成し、'workbook X' という名前を割り当てます。

ただし、毎回新しいワークブックを作成するのではなく、同じ参照を再利用しているように見えるため、各ワークブックは単に同じオブジェクトへの参照になります。

次回ループを通過するときは、この参照のタイトルを再割り当てするだけで、両方が更新されます。

これを試して、どのように応答するかを確認してください。

var workbook; // Just cleaner, avoids re-declaring the variable
for (var i = 0; i < 3; i++) {
    workbook = new Workbook; // avoids re-referencing the same Workbook
    workbook.setTitle("workbook " + (i + 1));
    for (var j = 0; j <2; j++ ) {
        var view = View;
        view.setTitle("view " + (j + 1));
        workbook.addView(view);
    }

    workbooks[i] = workbook;

    //this next for loop can be used to print the array as described    
    for (var k = 0; k < workbooks.length; k++) {
        console.log(workbooks[k].getTitle());
    }
}

return workbooks;
于 2013-07-26T23:03:18.277 に答える