Перевірка, чи об'єкт порожній, працює з ng-show, але не з контролера?


99

У мене об’єкт JS оголошений так

$scope.items = {};

Також у мене є $ http запит, який заповнює цей об’єкт предметами. Я хотів би визначити, чи цей пункт порожній, виявляється, що ng-show це підтримує ... Я вводжу

ng-show="items"

і магічно це працює, я також хотів би зробити те ж саме з контролера, але я не можу змусити його працювати, здається, мені, можливо, доведеться перебирати об’єкт, щоб побачити, чи є у нього властивості, або використовувати lodash або підкреслити .

Чи є альтернатива?

Я намагався

alert($scope.items == true);

але завжди повертається помилковим, коли об’єкт створений і коли він заповнений $http, тому його не працює таким чином.


1
У контролері ви просто використовуєте javascript, тому відповіді на це питання застосовуватимуться: stackoverflow.com/questions/4994201/is-object-empty
Cyrille Ka

Відповіді:


62

Використовувати порожній об'єкт буквальний тут не потрібно, ви можете використовувати 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
    };
});

Привіт, дякую за відповідь, але мені потрібно встановити властивості на об’єкт, перш ніж я фактично отримав інформацію від $ http. якщо його нуль, то я не міг би зробити items.available = true, чи можу я? У мене було враження, що мені потрібно створити об’єкт
Мартін

Якщо у мене є елементи = {}; чи немає в будь-якому випадку це підтвердити від контролера? звичайно, це не було б нульовим тут.
Мартін

1
Ця вимога не стосується вашого питання, тому моя відповідь заснована на надто спрощеному сценарії. Якщо вам дійсно потрібен об’єкт для початку, ви можете спробувати $scope.items = {available: false}, і ng-show="items.available", і у своєму контролері просто перевірити if (items.available) {...}.
Ye Liu

Дякую! насправді я закінчив тестувати його з невизначеним, і він працював чудово. Дякую.
Мартін

@YeLiu, якщо ви хочете зробити предмет у елементах недійсним, вам не дозволять зробити це двічі, кутовий викине виняток, який говорить вам, що він не дозволяє обробляти колекцію з колекції з незрозумілих для мене моїх причин.
Бурімі

199

Або ви могли б зробити це просто, зробивши щось подібне:

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

Моя також. Дякую добрий пане, мені не довелося перевантажувати більше функцій, щоб перевірити його.
Джиммі Кейн

1
Лише зауважте, для мого тесту (хром 45) також працювала проста рівність javascript:({} === $scope.items)
Jesper Rønn-Jensen

Хм, це оцінюється до помилкового, що дає? ({} == {})
chrismarx

Дуже розумний підхід! Один лайнер завжди кращий :)
supersan

якщо ви використовуєте для перегляду та використовуєте модель перегляду як область застосування, переконайтеся, що ви додали кутову для перегляду моделі, тобто vm.angular.equals ({}, items)
cinek

71

У приватному проекті написав цей фільтр

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

});

з повагою


2
Працює як шарм. Дякую, що поділились!
Чноч

2
Я вважаю, що фільтри повинні проаналізувати вміст і повернути підмножину вмісту. Те, що ви описуєте, більше схоже на функцію, розміщену на області дії, ніж на фільтрі. Див. Docs.angularjs.org/api/ng/filter/filter для отримання додаткової інформації.
кмкм

4
Я думаю, що ви говорите про конкретний фільтр під назвою filter або 'filterFilter'. Фільтр у куті може повернути все, що завгодно, а не лише підмножину даного вводу. Див. Docs.angularjs.org/api/ng/filter .
jcamelis

61

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

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

2
Це елегантно, але вам потрібно перевірити сумісність ECMAScript5 у веб-переглядачах, на які ви орієнтовані. Основна проблема полягає в тому, що це не буде працювати в IE8.
jmgem

8
Що стосується технічних даних, англу офіційно не підтримує IE8 у відділенні 1.3 (dev), а також не проводять тести на нього на 1.2 (стабільний) docs.angularjs.org/guide/ie ... Крім того, чим менше ми підтримуємо IE8, можливо, вона остаточно зникне. <вставити корпоративне спростування>
jaf0

2
Найкраща відповідь, якщо вам справді доводиться мати справу з порожнім об’єктом
chovy

27

Якщо ви не могли б об'єкти 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/ для отримання додаткових відомостей


7
if( obj[0] )

чистішою версією цього може бути:

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

де результат не буде визначений, якщо не встановлено жодної властивості об'єкта.


6

Або якщо використовується lo-dash: _.empty (значення).

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


-2

Позначте Порожній об’єкт

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

це просто неправильно. Порожні об’єкти не можна перевірити так
кайзер

-11

Ви можете перевірити довжину елементів

ng-show="items.length"

1
Я не розумію, чому ця відповідь має -1 голос? Може хтось мені це пояснить?
iluu

14
@KarolinaKafel тому, що itemsє об'єктом, а об'єкти не мають .lengthвластивості (як правило) - масиви мають їх
llamerr

2
Це не масив чувак :)
Ghazanfar Khan

@KarolinaKafel - це не масив, тоді items.length завжди не визначений.
Fabricio

Так, людина помилилася, -1 також показала б, що ця відповідь неправильна, чому -10? люди ростуть :)
Аадам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.