AngularJS - $watch 出现问题

AngularJS - Trouble with $watch

我正在尝试删除产品 SKU 上的 "Red" 和 "Blue" 下拉列表选项,如果用户是我商店网站上 "High" 组的成员。我想出的代码如下,但仅部分有效;唯一有效的是 window 警报。现在,如果我删除有关查找用户组的逻辑,那么它确实有效,但是用户必须首先设置颜色下拉列表的值。

function SpecController($scope) {
    angular.forEach($scope.user.Groups, function (g) {
        if (g.Name == "High") {
            alert('You are in the correct group!');
            $scope.$watch('user.Groups.Name', function (val) {
                if (!val) return;
                if (val == "High") {
                    $scope.Variant.Specs.Color.Options = $scope.Variant.Specs.Color.Options.filter(function (item) {
                        return item.Value !== 'Red' && item.Value !== 'Blue';
                    });
                }
            });
        }
    });
}

您的目标是在 groupName 上放置一个手表,它位于 Groups 对象的每个 Group 内。所以你当前的观察者指向 user.Groups.Name 实际上并不存在。如果你想让你当前的代码工作,那么你可以在放置 $watch

时使用索引

代码

function SpecController($scope) {
    angular.forEach($scope.user.Groups, function (g,index) { //added index param here
        if (g.Name == "High") {
            alert('You are in the correct group!');
            //used that index param here to put watch on each group.
            $scope.$watch('user.Groups['+ index + '].Name', function (val) { 
                if (!val) return;
                if (val == "High") {
                    $scope.Variant.Specs.Color.Options = $scope.Variant.Specs.Color.Options.filter(function (item) {
                        return item.Value !== 'Red' && item.Value !== 'Blue';
                    });
                }
            });
        }
    });
}

备注

This solution would mess when you will have more than 1000 groups in user.Groups, watcher number will increased and resultant would be app will work slowly.