Проверка, если объект пуст, работает с ng-show, но не от контроллера?
у меня есть объект JS, объявленный так
$scope.items = {};
у меня также есть запрос $http, который заполняет этот объект элементами. Я хотел бы определить, если этот элемент пуст, похоже, что ng-show поддерживает это... Я вхожу
ng-show="items"
и волшебно это работает, я также хотел бы сделать то же самое с контроллером, но я не могу заставить его работать, похоже, мне придется перебирать объект, чтобы увидеть, есть ли у него какие-либо свойства или использовать lodash или подчеркивать.
есть ли альтернатива?
Я пробовал
alert($scope.items == true);
но она всегда возвращает false , когда объект создается и заполняется при $http
, Так что это не работает таким образом.
9 ответов:
использовать пустой литерал объекта здесь не нужно, вы можете использовать null или undefined:
$scope.items = null;
таким образом,
ng-show
должен продолжать работать, и в вашем контроллере вы можете просто сделать:if ($scope.items) { // items have value } else { // items is still null }
и в
$http
обратные вызовы, вы делаете следующее:$http.get(..., function(data) { $scope.items = { data: data, // other stuff }; });
или вы могли бы сохранить его простым, делая что-то вроде этого:
alert(angular.equals({}, $scope.items));
в частном проекте A написал этот фильтр
angular.module('myApp') .filter('isEmpty', function () { var bar; return function (obj) { for (bar in obj) { if (obj.hasOwnProperty(bar)) { return false; } } return true; }; });
использование:
<p ng-hide="items | isEmpty">Some Content</p>
тестирование:
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); }); });
С уважением.
Если вы не можете иметь элементы OBJ, равные null, вы можете сделать это:
$scope.isEmpty = function (obj) { for (var i in obj) if (obj.hasOwnProperty(i)) return false; return true; };
и в представлении вы можете сделать:
<div ng-show="isEmpty(items)"></div>
можно сделать
var ob = {}; Object.keys(ob).length
только если Ваш браузер поддерживает ECMAScript 5. Например, IE 8 не поддерживает эту функцию.
см.http://kangax.github.io/compat-table/es5/ Для получения дополнительной информации
или, если используется lo-dash:_.пустое значение.)
" проверяет, является ли значение пустым. Массивы, строки или аргументы объекты длиной 0 и объекты без собственных перечислимых свойств считаются "пустыми"."