另一个无限$摘要循环

时间:2014-11-03 08:51:11

标签: angularjs angularjs-ng-repeat

在视图中的循环中执行循环:

<tr ng-repeat="result in results">
    <td>
        <span ng-repeat="device in helpers.getIosDevices(result.ios_device)">
            {{ device.code }}
        </span>
    </td>
</tr>

控制器:

$scope.helpers = CRM.helpers;

帮助者:

var CRM = CRM || {};

CRM.helpers = {
    // Handle "111" value format
    getIosDevices: function (devices) {
        var obj = [];

        if (devices !== null && devices !== undefined) {
            if (devices.charAt(0) === '1') {
                obj.push({
                    code: 'ipod',
                    name: 'iPod',
                });
            }
            if (devices.charAt(1) === '1') {
                obj.push({
                    code: 'ipad',
                    name: 'iPad',
                });
            }
            if (devices.charAt(2) === '1') {
                obj.push({
                    code: 'iphone',
                    name: 'iPhone',
                });
            }
        }

        return obj;
    }
};

出现此错误:https://docs.angularjs.org/error/ $ rootScope / infdig?p0 = 10&amp; p1 =%5B%5B%22fn:%E2%80%A620%20%20%7D;%20newVal:%20undefined;% 20oldVal:%20undefined%22%5D%5D

据我所知,但我不知道如何解决这个问题。我应该使用哪种解决方法?

1 个答案:

答案 0 :(得分:1)

在摘要周期中尝试更改ng-repeat指令中的源列表时出现此错误的原因。

<span ng-repeat="device in helpers.getIosDevices(result.ios_device)">
                                     ^^^^^^^^
obj.push(/* ... */)

getIosDevices

首先,当摘要周期停止循环时,我们需要问自己:当Angular检测到在几次迭代中列表没有改变时,它将停止。在您的情况下,每次ng-repeat调用getIosDevices方法时 - 列表会获得不同的项目,因此它会再次循环,直到您获得限制并且Angular会删除此异常。


那么解决方案是什么:

在Angular中,在ngRepeat中调用方法 getList()是不好的做法。因为开发人员会犯错误。

很明显,在你的情况下,getIosDevices()列表取决于results,因此我会在results上创建一些与修复的对象和一些观察者并编写HTML部分:

<tr ng-repeat="result in results">
    <td>
        <span ng-repeat="device in devices[result.ios_device]">
            {{ device.code }}
        </span>
    </td>
</tr>

其中devices代表地图。


这是一些可能对您有帮助的演示:

$scope.results = [{
        ios_device: "100"
    }, {
        ios_device: "010"
    }, {
        ios_device: "001"
    }];


    $scope.devices = {
        "100": [{
            code: 'ipod',
            name: 'iPod1',
        },
               {
            code: 'ipod',
            name: 'iPod2',
        }],
            "010": [{
            code: 'ipod',
            name: 'iPod1',
        },
               {
            code: 'ipad',
            name: 'iPad2',
        }],
            "001": [{
            code: 'ipod',
            name: 'iPod1',
        },
               {
            code: 'iphone',
            name: 'iphone2',
        }],
    }

HTML

<table>
    <tr ng-repeat="result in results">
        <td><span ng-repeat="device in devices[result.ios_device]">
        {{ device.code }}
    </span>

        </td>
    </tr>
</table>

中的演示 Fiddle