it-swarm.com.ru

Проверка, является ли объект пустым, работает с ng-show, но не с контроллера?

У меня есть объект JS объявлен так

$scope.items = {};

У меня также есть запрос $ http, который заполняет этот объект элементами. Я хотел бы обнаружить, если этот элемент пуст, кажется, что ng-show поддерживает это ... Я ввожу

ng-show="items"

и волшебным образом это работает, я также хотел бы сделать то же самое с контроллера, но я не могу заставить его работать, кажется, мне, возможно, придется перебрать объект, чтобы посмотреть, есть ли у него какие-либо свойства или использовать lodash или подчеркивание ,.

Есть ли альтернатива?

Я попробовал

alert($scope.items == true);

но он всегда возвращает false, когда объект создан и заполнен $http, поэтому он не работает таким образом.

98
Martin

Использовать пустой литерал объекта здесь не обязательно, вы можете использовать ноль или неопределенный:

$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
    };
});
62
Ye Liu

Или вы можете сделать это просто, сделав что-то вроде этого:

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

В частном проекте написал этот фильтр

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);
    });

});

с уважением.

71
jcamelis

еще один простой однострочник:

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

Если вы не можете иметь элементы 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/ для получения дополнительной информации

27
mattia.corci
if( obj[0] )

более чистая версия этого может быть:

if( typeof Object.keys(obj)[0] === 'undefined' )

где результат будет неопределенным, если не установлено свойство объекта.

7
n0mad

Или, если вы используете lo-dash: _.empty (value).

"Проверяет, является ли значение пустым. Массивы, строки или аргументы объекты с длиной 0 и объекты без собственных перечисляемых свойств считаются" пустыми "."

6
Jeff Pace