Подтвердить что ты не робот

Почему этот простой 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);
}
4b9b3361

Ответ 1

Вам нужно сообщить 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);
}

Ответ 2

Лучше всего это сделать, позвонив $scope.$digest();, чтобы обновить интерфейс пользователя

Ответ 3

Вам нужно использовать $timeout и ввести его в контроллер:

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

Скриншот демо

Изменить: удален $scope.apply();, как предложил @Salman

Ответ 4

Вы хотите использовать apply(), чтобы остановить загрузку сообщения.

Отметьте Demo jsFiddle **.

JavaScript:

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

Надеюсь, это поможет вам!

Ответ 5

при событии fire angular для другого объекта, такого как 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
            });
         }
    } 

Ответ 6

Я обнаружил, что один способ обойти ng-show не оценивается так, как вы хотите, - вместо этого использовать ng-класс.

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

Таким образом, когда $scope.loading не равен true, класс css 'loaded' будет добавлен к элементу. Тогда вам просто нужно использовать класс css для отображения/скрытия содержимого.

.mycontent {
    display: none;
}

.loaded {
    display: block;
}