javascript - ngshow - ng-show not working
¿Por qué este simple AngularJS ng-show no funciona? (7)
No puedo entender por qué mi aplicación AngularJS simple no funciona como se esperaba. "Cargando ..." se supone que está oculto, y "¡Hecho!" debe mostrarse después de 1 segundo.
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);
}
Creo que el mayor problema aquí es que está utilizando un modelo primitivo. El equipo angular recomienda usar un objeto para atar su modelo a. Por ejemplo:
scope.model = {};
scope.model.loading = false;
Luego en tu html:
<div class="text-center" ng-show="model.loading">
De esa manera, angular obtiene una referencia a un campo dentro de un objeto en lugar de que una variable apunte a una primitiva.
Cuando dispare un evento angular a otro objeto como setTimeout, debe usar
$scope.$apply(function(){
$scope.loading = false;
});
por ejemplo
var loading={
show:function(){
$scope.loading=true
},
hide:function(){
$scope.loading=false
}
}
puede que no funcione de la mejor manera
var loading={
show:function(){
$scope.$apply(function(){
$scope.loading=true
});
},
hide:function(){
$scope.$apply(function(){
$scope.loading=false
});
}
}
Desea utilizar la función apply()
para detener la carga del mensaje.
Revisa este Demo jsFiddle **.
JavaScript:
function TestCtrl($scope) {
$scope.loading = true;
setTimeout(function () {
$scope.$apply(function(){
$scope.loading = false;
});
}, 1000);
}
Espero que esto te ayude!
He encontrado que una forma de evitar que ng-show no se evalúe de la forma que usted quiere es usar ng-class en su lugar.
<div class="mycontent" data-ng-class="{''loaded'': !loading}">
De esta manera, cuando $ scope.loading no es igual a verdadero, la clase css ''cargada'' se agregará al elemento. Entonces solo necesitas una para usar la clase css para mostrar / ocultar el contenido.
.mycontent {
display: none;
}
.loaded {
display: block;
}
Necesita usar $timeout
e inyectarlo en su controlador:
function TestCtrl($scope, $timeout) {
$scope.loading = true;
$timeout(function () {
$scope.loading = false;
}, 1000);
}
Edición: eliminado $scope.apply();
como sugirió @Salman
Necesitas decirle a angular que has actualizado la var:
function TestCtrl($scope) {
$scope.loading = true;
setTimeout(function () {
$scope.$apply(function(){
$scope.loading = false;
});
}, 1000);
}
o solo
function TestCtrl($scope, $timeout) {
$scope.loading = true;
$timeout(function () {
$scope.loading = false;
}, 1000);
}
Una mejor manera de hacerlo es llamando a $scope.$digest();
para actualizar su interfaz de usuario