我正在尝试检查是否存在某些内容,并根据该按钮显示一个按钮。我做错了什么,我该如何解决?
我的代码如下所示:
$scope.isURL = function(url) {
$http.get(url).success(function (data) {
if (data === 302) {
return true
}
});
};
我的HTML:
<ul ng-repeat="foo in foos">
<button ng-hide="isURL(foo.url)">visit site</button>
<button ng-show="isURL(foo.url)">remove bookmark?</button>
</ul>
我得到错误循环:
Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: []
答案 0 :(得分:3)
最大的问题是,您正在为每次返回新承诺的函数设置绑定。
$digest
周期将触发,并评估函数的结果并确定结果已更改,使其变脏。这将触发另一个$digest
循环,该循环将无限期地继续。
更好的选择是检查每个网址,并在foo
对象上设置属性,如果它们是好的。
app.controller('displayCtrl', ['$scope','$http', function(scope,$http){
var foos = [
{name: 'foo-1', url:'assets/foo.html'},
{name: 'foo-2', url:'assets/bad.html'}
];
angular.forEach(foos, function(foo){
$http.get(foo.url).success(function (data) {
if(data === 302){
foo.isUrl = true;
}
});
});
scope.foos = foos;
}]);
然后你可以在你的标记中绑定到这个:
<ul ng-repeat="foo in foos">
<button ng-hide="foo.isUrl">visit site</button>
<button ng-show="foo.isUrl">remove bookmark?</button>
</ul>
答案 1 :(得分:0)
你可能想尝试这样的事情:
$scope.urls = {};
$scope.isURL = function(url) {
if (angular.isUndefined($scope.urls[url])) {
$scope.urls[url] = false;
$http.get(url).success(function(data) {
if (data === 302) {
$scope.urls[url] = true;
}
return data;
});
}
return $scope.urls[url];
};
这也会阻止您多次检查每个网址。我不确定你为什么要检查data === 302
,但我猜你知道你在那里做什么。如果您要检查状态代码,那将无效,您需要使用此代码:
$http.get(url).then(function(response) {
if (response.status === 302) {
$scope.urls[url] = true;
}
return response;
});
修改强>
可以在AngularJS web site上找到有关如何使用ngShow
(以及其他指令)的文档。如果在ngShow
指令中计算的表达式是真实的,则将显示该元素。在您的代码示例中,$scope.isURL(...)
不会返回值。