개체가 비어 있는지 확인하고 ng-show에서는 작동하지만 컨트롤러에서는 작동하지 않습니까?


99

이렇게 선언 된 JS 개체가 있습니다.

$scope.items = {};

이 개체를 항목으로 채우는 $ http 요청도 있습니다. 이 항목이 비어 있는지 감지하고 싶습니다. ng-show가이를 지원하는 것 같습니다 ... 입력

ng-show="items"

그리고 마술처럼 작동합니다. 컨트롤러에서도 똑같이하고 싶지만 작동하지 않는 것 같습니다. 속성이 있는지 확인하기 위해 객체를 반복해야하거나 lodash 또는 밑줄을 사용해야 할 수 있습니다. .

대안이 있습니까?

나는 시도했다

alert($scope.items == true);

그러나 객체가 생성되고로 채워질 때 항상 false를 반환 $http하므로 그렇게 작동하지 않습니다.


1
컨트롤러에서, 당신은 자바 스크립트를 사용하여, 그래서이 질문의 답이 적용됩니다 : stackoverflow.com/questions/4994201/is-object-empty을
시릴 카

답변:


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로부터 정보를 받기 전에 객체에 속성을 설정해야합니다. null이면 items.available = true 할 수 없습니까? 난 내가 객체를 생성해야한다고 인상이었다
마틴

항목이있는 경우 = {}; 어쨌든 컨트롤러에서 이것을 확인할 수 없습니까? 물론 여기에서는 null이 아닙니다.
Martin

1
이 요구 사항은 귀하의 질문에 없으므로 내 대답은 지나치게 단순화 된 시나리오를 기반으로합니다. 시작할 개체가 정말로 필요한 경우 $scope.items = {available: false}, 및을 시도 하고 ng-show="items.available"컨트롤러에서 if (items.available) {...}.
Ye Liu

감사! 실제로 나는 정의되지 않은 상태로 테스트를 끝냈고 훌륭하게 작동했습니다. 감사.
Martin

@YeLiu 항목에서 항목을 null로 만들고 싶다면 두 번 만들 수 없습니다 .angular는 지금까지 알 수없는 이유로 컬렉션 내에서 복제를 허용하지 않는다는 예외를 throw합니다.
Burimi

199

또는 다음과 같이 간단하게 유지할 수 있습니다.

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

내 것도. 좋은 주님 감사합니다 나는 그것을 테스트하기 위해 더 많은 기능을 과부하 할 필요가 없었습니다.
Jimmy Kane

1
그냥 메모, 내 테스트 (크롬 45)에 대한 간단한 자바 스크립트 평등도했다 :({} === $scope.items)
예스퍼 Rønn - 젠슨에게

흠, 이것은 거짓으로 평가됩니다. ({} == {})
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
매력처럼 작동합니다. 공유해 주셔서 감사합니다!
Chnoch 2014 년

2
필터가 콘텐츠를 구문 분석하고 콘텐츠의 하위 집합을 반환해야한다고 생각합니다. 당신이 설명하는 것은 필터 라기보다는 스코프에 배치 된 함수처럼 보입니다. 자세한 내용은 docs.angularjs.org/api/ng/filter/filter 를 참조하십시오.
kmkm

4
필터 또는 'filterFilter'라는 특정 필터에 대해 이야기하고 있다고 생각합니다. 각도의 필터는 주어진 입력의 하위 집합뿐만 아니라 원하는 모든 것을 반환 할 수 있습니다. docs.angularjs.org/api/ng/filter를 참조하십시오 .
jcamelis 2014 년

61

또 다른 간단한 한 줄 :

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

2
이것은 우아하지만 대상 브라우저에서 ECMAScript5 호환성을 확인해야합니다. 주요 함정은 이것이 IE8에서 작동하지 않는다는 것입니다.
jmgem 2014-10-27

8
기술적으로 angula는 1.3 (dev) 브랜치에서 IE8을 공식적으로 지원하지 않으며 1.2 (안정적) docs.angularjs.org/guide/ie 에서 테스트를 실행하지도 않습니다 . 마침내 사라질 것입니다. <기업 반박 삽입>
jaf0 2014 년

2
당신이 정말로 빈 객체와 우수 답변을 처리해야하는 경우
chovy

27

항목 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/ 참조


7
if( obj[0] )

이것의 더 깨끗한 버전은 다음과 같습니다.

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

개체 속성이 설정되지 않은 경우 결과가 정의되지 않습니다.


6

또는 lo-dash를 사용하는 경우 : _.empty (value).

"값이 비어 있는지 확인합니다. 길이가 0 인 배열, 문자열 또는 인수 개체와 고유 한 열거 가능한 속성이없는 개체는"빈 "것으로 간주됩니다."


-2

빈 개체 확인

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

그건 틀렸어요. 빈 개체는 그렇게 테스트 할 수 없습니다
kaiser

-11

항목의 길이를 확인할 수 있습니다

ng-show="items.length"

1
이 답변이 -1 표를 얻은 이유를 이해할 수 없습니까? 누군가 제발 설명해 주시겠습니까?
iluu

14
@KarolinaKafel items은 객체이고 객체에는 .length속성 이 없기 때문에 (일반적으로)-배열에는 속성이 있습니다
llamerr

2
그것은 : 배열 친구 아니다
Ghazanfar 칸

@KarolinaKafel은 배열이 아니므로 items.length는 항상 정의되지 않습니다.
Fabricio

Ya ya 인간이 실수를했다면 -1도이 대답이 틀렸다는 걸 보여줬을 텐데, 왜 -10? 사람들이 성장합니다 :)
Aadam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.