Angularjs:你如何使用ng-show?

时间:2014-02-17 01:36:41

标签: angularjs

我正在尝试检查是否存在某些内容,并根据该按钮显示一个按钮。我做错了什么,我该如何解决?

我的代码如下所示:

$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: []

2 个答案:

答案 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(...)不会返回值。