为什么这个简单的AngularJS ng-show不起作用?

时间:2014-04-05 13:15:15

标签: javascript angularjs ng-show

我无法弄清楚为什么我的简单AngularJS应用程序没有按预期工作。 "加载中"应该被隐藏,并且完成!"完成!"应在1秒后显示。

HTML:

<div ng-app>
    <div ng-controller="TestCtrl">
        <div class="text-center" ng-show="loading">
            <h1>Loading...</h1>

    </div>
        <div class="text-center" ng-show="!loading">
            <h1>Done!</h1>

        </div>
    </div>
</div>

使用Javascript:

function TestCtrl($scope) {
    $scope.loading = true;
    setTimeout(function () {
        $scope.loading = false;
    }, 1000);
}

7 个答案:

答案 0 :(得分:58)

你需要告诉angular你更新了var:

function TestCtrl($scope) {
    $scope.loading = true;
    setTimeout(function () {
        $scope.$apply(function(){
            $scope.loading = false;
        });
    }, 1000);
}

或只是

function TestCtrl($scope, $timeout) {
    $scope.loading = true;
    $timeout(function () {
        $scope.loading = false;
    }, 1000);
}

答案 1 :(得分:12)

更好的方法是调用$scope.$digest();来更新您的用户界面

答案 2 :(得分:6)

您需要使用$timeout并将其注入您的控制器:

function TestCtrl($scope, $timeout) {
    $scope.loading = true;
    $timeout(function () {
        $scope.loading = false;
    }, 1000);
}

Fiddle demo

编辑: 已删除$scope.apply(); @Salman建议

答案 3 :(得分:6)

您希望使用apply()功能停止加载消息。

检查Demo jsFiddle **。

JavaScript的:

function TestCtrl($scope) {
    $scope.loading = true;
    setTimeout(function () {
        $scope.$apply(function(){
            $scope.loading = false;
        });
    }, 1000);
}

希望这会对你有所帮助!

答案 4 :(得分:4)

当火焰角度事件发生到像setTimeout这样的另一个对象时,你应该使用

$scope.$apply(function(){
     $scope.loading = false;
});

例如

var loading={
     show:function(){
        $scope.loading=true
     },
     hide:function(){
        $scope.loading=false
     }
}  

可能效果不佳

   var loading={
         show:function(){
            $scope.$apply(function(){
               $scope.loading=true
            });
         },
         hide:function(){
            $scope.$apply(function(){
               $scope.loading=false
            });
         }
    } 

答案 5 :(得分:1)

我发现一种解决ng-show无法以你想要的方式进行评估的方法是使用ng-class。

 <div class="mycontent" data-ng-class="{'loaded': !loading}"> 

这样当$ scope.loading不等于true时,css类加载了#c;将被添加到元素中。 然后你只需要使用css类来显示/隐藏内容。

.mycontent {
    display: none;
}

.loaded {
    display: block;
}

答案 6 :(得分:0)

我认为这里最大的问题是您使用原语作为模型。角度团队建议使用一个对象来绑定模型。例如:

scope.model = {};
scope.model.loading = false;

然后在你的html:

<div class="text-center" ng-show="model.loading">

这样,angular获取对象内部字段的引用,而不是变量指向的基元。