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.
我正在尝试删除产品 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
inuser.Groups
, watcher number will increased and resultant would be app will work slowly.