J'ai un objet JS déclaré comme tel
$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"
et comme par magie ça marche, je voudrais aussi faire la même chose avec un contrôleur mais je n'arrive pas à le faire fonctionner, il semble que je devrais peut-être parcourir l'objet pour voir s'il a des propriétés ou utiliser lodash ou un trait de soulignement .
Y a-t-il une alternative?
J'ai essayé
alert($scope.items == true);
mais il retourne toujours false lorsque l'objet est créé et lorsqu'il est rempli avec $http
, il ne fonctionne donc pas de cette façon.
Utiliser un littéral d'objet vide n'est pas nécessaire ici, vous pouvez utiliser null ou undefined:
$scope.items = null;
De cette façon, ng-show
devrait continuer à fonctionner, et dans votre contrôleur, vous pouvez simplement faire:
if ($scope.items) {
// items have value
} else {
// items is still null
}
Et dans vos rappels $http
, vous procédez comme suit:
$http.get(..., function(data) {
$scope.items = {
data: data,
// other stuff
};
});
Ou vous pouvez garder les choses simples en faisant quelque chose comme ceci:
alert(angular.equals({}, $scope.items));
Dans un projet privé, a é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;
};
});
usage:
<p ng-hide="items | isEmpty">Some Content</p>
essai:
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);
});
});
cordialement.
un autre simple one-liner:
var ob = {};
Object.keys(ob).length // 0
Si vous ne pouvez pas avoir les objets 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, vous pouvez faire:
<div ng-show="isEmpty(items)"></div>
Tu peux faire
var ob = {};
Object.keys(ob).length
Seulement si votre navigateur prend en charge ECMAScript 5. Par exemple, IE 8 ne prend pas en charge cette fonctionnalité.
Voir http://kangax.github.io/compat-table/es5/ pour plus d'informations
if( obj[0] )
une version plus propre de ceci pourrait être:
if( typeof Object.keys(obj)[0] === 'undefined' )
où le résultat sera indéfini si aucune propriété d'objet n'est définie.
Ou, si vous utilisez lo-dash: _.empty (valeur).
"Vérifie si la valeur est vide. Les objets de tableau, de chaîne ou d'argument de longueur 0 et les objets sans propriété énumérable sont considérés comme" vides "."