$ watchCollection

时间:2015-05-20 20:29:00

标签: javascript angularjs watch

我想看一个对象x来查看它的任何属性是否有变化。属性是复选框。如果用户选中该框,则会将checked属性(prop1)更改为1.

每个属性都包含特定内容,因此如果启用,则应扩展包含元素的高度以考虑该新内容。

        $scope.x = {
            prop1: 0, 
            prop2: 0,
            prop3: 0,
            prop4: 0,
        };

我看是否在x中进行了任何更改。如果是,则更新元素的高度:

    $scope.$watchCollection('x', function(embed){
        $scope.x.height = $scope.getHeight();
    });

调用获取高度,调用checkOptions()将元素添加到指定的缓冲区空间:

    $scope.getHeight = function () {
        $scope.checkOptions();
        return Math.ceil(($scope.totalElements / $scope.totalCols) * elementHeight);
    };

    $scope.checkOptions = function () {
        if ($scope.x.prop1 === 1) {
            elementHeight += 50px;
        }
        ...other properties

HTML使用复选框,检查是/否:

        <fieldset class="modal-checkbox">
            <input type="checkbox"
                   id="element-prop1"
                   ng-model="x.prop1"
                   ng-true-value="1"
                   ng-false-value="0">
            <label for="element-prop1">
                <span>Element Prop 1</span>
            </label>
        </fieldset>

当我点击复选框时,它会不断增加高度,最后:

  

错误:[$ rootScope:infdig] 10 $ digest()迭代达成。中止!   观察者在最近5次迭代中被解雇:[[{“msg”:“fn:   regularInterceptedExpression “ ”的newval“:39, ”OLDVAL“:38},{ ”msg“ 中:” FN:   expressionInputWatch”, “的newval”: “6168”, “OLDVAL”: “6006”}],'

我检查了Angular $watchCollection,它似乎完全符合我的要求...在x对象中查看集合以查找更改...

$digest说:

  

处理当前范围及其子项的所有观察者。   因为观察者的监听器可以改变模型,所以$ digest()保持不变   打电话给观察者直到不再有听众开枪。这意味着   可以进入无限循环。

我不知道为什么我会得到循环。

1 个答案:

答案 0 :(得分:3)

您的手表功能是个问题。每当您更改$scope.x.height时,它都会检测到x已更改并再次触发手表。

将高度属性移出x并将其放在其他位置,或者确保无论运行getHeight()多少次,该值都不会有所不同。

顺便说一句,当你使用ng-true-value或ng-false-value时,该值将是一个字符串。