Если объект пуст, работает с ng-show, но не с контроллера?
У меня есть объект JS, объявленный таким образом
$scope.items = {};
У меня также есть запрос $http, который заполняет этот объект элементами. Я хотел бы обнаружить, что этот элемент пуст, кажется, что ng-show поддерживает это... Я ввожу
ng-show="items"
и волшебным образом это работает, я также хотел бы сделать то же самое с контроллера, но я не могу заставить его работать, кажется, мне, возможно, придется перебирать объект, чтобы увидеть, есть ли у него какие-либо свойства или использовать lodash или подчеркивание.
Есть ли альтернатива?
Я попытался
alert($scope.items == true);
но он всегда возвращает false, когда объект создается и заполняется с помощью $http
, поэтому он не работает таким образом.
Ответы
Ответ 1
Использовать пустой литерал объекта здесь не требуется, вы можете использовать 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
};
});
Ответ 2
Или вы можете сохранить это простым, сделав что-то вроде этого:
alert(angular.equals({}, $scope.items));
Ответ 3
В частном проекте 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 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);
});
});
С уважением.
Ответ 4
еще один простой однострочный:
var ob = {};
Object.keys(ob).length // 0
Ответ 5
Если вы не могли иметь OBJ равным нулю, вы можете сделать это:
$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/
Ответ 6
Или, если вы используете lo-dash: _.empty(значение).
"Проверяет, пусто ли значение. Объекты массивов, строк или аргументов с длиной 0 и объектами без собственных перечислимых свойств считаются" пустыми ".
Ответ 7
if( obj[0] )
более чистая версия может быть:
if( typeof Object.keys(obj)[0] === 'undefined' )
где результат будет undefined, если не задано свойство объекта.
Ответ 8
Проверить пустой объект
$scope.isValid = function(value) {
return !value
}
Ответ 9
вы можете проверить длину элементов
ng-show="items.length"