0

我正在编写一个有角度的应用程序,并创建了一组名为 Workbooks 的自定义服务,每个都有一组名为 Views 的自定义服务。我用一个简单的 for 循环填充数组,但由于某种原因,这会产生意想不到的结果:

第一次迭代后,数组中有一个工作簿: Workbook 1

在第二个之后,两个名为 workbook 2的工作簿:Workbook 2 Workbook 2

第三次之后: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 个点。什么时候i是 2,如何将名为工作簿的工作簿Workbook 3分配到数组中的第 0 和第 1 个位置以及第 2 个位置?

作为参考,这里是应用程序中相关代码的plunker 。谢谢!

4

3 回答 3

1

您没有将第 i 个工作簿分配给数组中的每个位置,而是将 SAME 工作簿分配给每个位置,然后更新标题。你需要做

var workbook = Workbook;

进入这个

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

您需要在工厂实现中为每个工厂调用返回新对象。

GATapp.factory('Workbook', function () { 
    return function () {
        var title;
        var views = [];
        this.getTitle = function () {
            return title;
        }
        this.setTitle = function (newTitle) {
            title = newTitle;
        }
        this.getViews = function () {
            return views;
        }
        this.addView = function (newView) {
            views.push(newView);
        }
        this.getView = function (i) {
            return views[i].getTitle();
        }
    };
});

并在您使用工厂时创建新对象。

var workbook = new Workbook();

请看一下。PLNKR

于 2013-07-26T23:12:59.280 回答
0

好吧,第一个问题:

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

每次通过此循环,您都将重新创建变量“工作簿”,并将其命名为“工作簿 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 回答