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


у меня есть объект JS, объявленный так

$scope.items = {};

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

ng-show="items"

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

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

Я пробовал

alert($scope.items == true);

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

9 95

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

});

С уважением.

еще один простой один-лайнер:

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

Если вы не можете иметь элементы 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 и объекты без собственных перечислимых свойств считаются "пустыми"."

if( obj[0] )

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

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

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

проверить пустой объект

$scope.isValid = function(value) {
    return !value
}

вы можете проверить длину элементов

ng-show="items.length"