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

dar*_*eac 40 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>
Run Code Online (Sandbox Code Playgroud)

使用Javascript:

function TestCtrl($scope) {
    $scope.loading = true;
    setTimeout(function () {
        $scope.loading = false;
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

Dee*_*psy 58

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

function TestCtrl($scope) {
    $scope.loading = true;
    setTimeout(function () {
        $scope.$apply(function(){
            $scope.loading = false;
        });
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

要不就

function TestCtrl($scope, $timeout) {
    $scope.loading = true;
    $timeout(function () {
        $scope.loading = false;
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的做法,但为什么呢?如果我使用新值更新$ scope,那么$ watch列表中是否已存在$ scope属性,并且应该通过双向绑定的魔力自动更新DOM?不明白为什么$ scope.$ apply()是必要的. (30认同)
  • 你得到了StarSky答案的错误,因为$ timeout启动了一个摘要周期,$ apply正在尝试启动第二个,但是你不能再有超过1个摘要. (2认同)

Tac*_*ter 12

更好的方法是调用$scope.$digest();更新UI


Sta*_*Sky 6

您需要$timeout在控制器中使用并注入它:

function TestCtrl($scope, $timeout) {
    $scope.loading = true;
    $timeout(function () {
        $scope.loading = false;
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

小提琴演示

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


Jay*_*tel 6

您想使用apply()函数来停止加载消息.

检查这个演示jsFiddle**.

JavaScript的:

function TestCtrl($scope) {
    $scope.loading = true;
    setTimeout(function () {
        $scope.$apply(function(){
            $scope.loading = false;
        });
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

希望这会对你有所帮助!