Если объект пуст, работает с 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"