99 votes

Vérifier si l'objet est vide, fonctionne avec ng-show mais pas depuis le contrôleur ?

J'ai un objet JS déclaré comme suit

$scope.items = {};

J'ai également une requête $http qui remplit cet objet avec des éléments. Je voudrais détecter si cet élément est vide, il semble que ng-show supporte cela... J'entre

ng-show="items"

J'aimerais également faire la même chose à partir d'un contrôleur mais je n'arrive pas à le faire fonctionner. Il semble que je doive itérer sur l'objet pour voir s'il a des propriétés ou utiliser lodash ou underscore.

Existe-t-il une alternative ?

J'ai essayé

alert($scope.items == true);

mais il renvoie toujours false, quand l'objet est créé et quand il est rempli de $http donc ça ne marche pas comme ça.

199voto

testing123 Points 2004

Ou vous pouvez rester simple en faisant quelque chose comme ceci :

alert(angular.equals({}, $scope.items));

71voto

jcamelis Points 1189

Dans un projet privé, j'ai écrit ce filtre

angular.module('myApp')
    .filter('isEmpty', function () {
        var bar;
        return function (obj) {
            for (bar in obj) {
                if (obj.hasOwnProperty(bar)) {
                    return false;
                }
            }
            return true;
        };
    });

l'usage :

<p ng-hide="items | isEmpty">Some Content</p>

de test :

describe('Filter: isEmpty', function () {

    // load the filter's module
    beforeEach(module('myApp'));

    // initialize a new instance of the filter before each test
    var isEmpty;
    beforeEach(inject(function ($filter) {
        isEmpty = $filter('isEmpty');
    }));

    it('should return the input prefixed with "isEmpty filter:"', function () {
          expect(isEmpty({})).toBe(true);
          expect(isEmpty({foo: "bar"})).toBe(false);
    });

});

regards.

63voto

Ye Liu Points 4474

Utiliser un objet littéral vide n'est pas nécessaire ici, vous pouvez utiliser null ou undefined :

$scope.items = null;

De cette façon, ng-show devrait continuer à travailler, et dans votre contrôleur vous pouvez juste faire :

if ($scope.items) {
    // items have value
} else {
    // items is still null
}

Et dans votre $http vous faites ce qui suit :

$http.get(..., function(data) {
    $scope.items = {
        data: data,
        // other stuff
    };
});

61voto

Daniel Weigh Points 104

Une autre simple phrase :

var ob = {};
Object.keys(ob).length // 0

27voto

mattia.corci Points 534

Si vous ne pouviez pas avoir les éléments OBJ égaux à null, vous pouvez faire ceci :

$scope.isEmpty = function (obj) {
    for (var i in obj) if (obj.hasOwnProperty(i)) return false;
    return true;
};

et dans la vue que vous pouvez faire :

<div ng-show="isEmpty(items)"></div>

Vous pouvez faire

var ob = {};
Object.keys(ob).length

Seulement si votre navigateur supporte ECMAScript 5. Par exemple, IE 8 ne prend pas en charge cette fonctionnalité.

Véase http://kangax.github.io/compat-table/es5/ pour plus d'informations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X