【问题标题】:$scope.watchCollection with if statements removes array data带有 if 语句的 $scope.watchCollection 删除数组数据
【发布时间】:2016-05-09 11:38:06
【问题描述】:

所以我对 watchCollection 语句有点困惑。我正在观察我的数组对象的变化,并且我注意到每当我在 $watch 函数中使用 if 语句时,我都会删除数组的 1 个元素。我很困惑为什么 $watchCollection 函数是一个迭代过程,其中 in 重新运行数组的长度。我在下面有这个简单的手表功能:

            scope.$watchCollection('waypoints', function () {
                if (scope.waypoints.length > 1) {
                    if (scope.waypoints[scope.waypoints.length - 1] == "`") {
                        scope.waypoints.pop();
                    }
                    calculateAndDisplayRoute(directionsService, directionsDisplay, scope.waypoints);
                }
            });

当我运行 if 语句时,我从数组中丢失了一个元素。我什至创建了一个带有调试器的 jsfiddle,显示 $watch 函数会重复数组 http://jsfiddle.net/kL6909to/ 的长度。

【问题讨论】:

    标签: angularjs scope angularjs-scope watch


    【解决方案1】:

    根据documentation,观察到的参数($watchCollection的第一个参数)如下:

    obj 集合是通过标准 $watch 操作观察到的,并且是 在每次调用 $digest() 时检查是否有任何项目 添加、删除或移动。

    观察者仅验证长度是否已更改是不够的。相反,它必须迭代数组以检查不仅长度,而且检查该数组中的任何元素是否已被修改,以及它们在观察数组中的位置。对集合的每一次修改都会发生这种情况。

    【讨论】:

    • 这对于 $watch 本身是有意义的,但对于 if 语句而言。我注意到对于每个 if 语句,都会从我的数组中删除一个元素。这是为什么?例如,如果我在 $watch 函数中有 2 个 if 语句,我会在能够运行 calculateAndDisplayRoute 函数之前丢失数组中的 2 个元素。
    • @JuliusDoan 你的 jsfiddle 没有简洁地复制你的帖子。您能否发布一个更简洁的小提琴来展示您所看到的行为,并说明为什么它的行为不符合预期?
    • 抱歉,jsfiddle 是针对我关于 digest() 的第一个问题。我将更新 jsfiddle 并尝试使用 if 语句重新创建数组丢失的问题。
    • @JuliusDoan 非常感谢!那会很有帮助
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多