循环行为真的很奇怪

时间:2014-10-25 18:30:52

标签: javascript json angularjs

我在循环中比较2个整数,循环遍历包含JSON对象的数组。 JSON对象包含ID和名称。当我点击我窗口的关闭按钮时,该窗口应该消失,其他窗口应该保留,但是如果我关闭具有最高ID的窗口,那么所有这些都会关闭,例如我关闭第五个窗口#1 -5关闭,但ID仍然较高。

    ctrl.items = [{
        id: 1,
        name: "Number one"
    },
    {
        id: 2,
        name: "Number two"
    },
    {
        id: 3,
        name: "Number three"
    }];

    ctrl.removeWindow = function(toBeRemovedId) {
        console.log("Called: " + toBeRemovedId);
        for (var i = ctrl.items.length - 1; i >= 0; i--) {
            console.log(ctrl.items[i].id + " " + toBeRemovedId);
            if(ctrl.items[i].id == toBeRemovedId) {
                ctrl.items.splice(ctrl.items[i], 1);
            }
        };
    }

    <div class="window show" id="item_window" ng-repeat="item in itemWindowCtrl.items">
        <hgroup>
            <h1>{{ item.name}}</h1>
            <button class="close" ><span class="fa fa-times fa-lg" ng-click="itemWindowCtrl.removeWindow(item.id)"></span></button>
        </hgroup>
        <section>
            <p>{{ item.id + " " + item.name }}</p>
        </section>
    </div>

提前感谢您提供给我的任何线索。

2 个答案:

答案 0 :(得分:1)

数组拼接函数接受索引,而不是要删除的项,所以你应该这样做:

ctrl.items.splice(i, 1);

虽然循环有点不必要。为什么不直接通过要删除的项目而不是以递减的id顺序循环来查找匹配的ID?例如:

ng-click="itemWindowCtrl.removeWindow(item)"

然后在你的控制器/指令中:

ctrl.items.splice(ctrl.items.indexOf(item), 1);

答案 1 :(得分:0)

更改for循环以获取索引,然后只删除该索引

   var index = -1;
   for (var i = 0; i < ctrl.items.length; i++) {
        if(ctrl.items[i].id === toBeRemovedId) {
            index = i;
        }
    };
    ctrl.items.splice(index, 1);