99

我有一个像这样声明的 JS 对象

$scope.items = {};

我还有一个 $http 请求,它用项目填充这个对象。我想检测这个项目是否为空,看来 ng-show 支持这个...我输入

ng-show="items"

并且神奇地工作,我也想从控制器做同样的事情,但我似乎无法让它工作,看来我可能不得不迭代对象以查看它是否有任何属性或使用 lodash 或下划线.

有替代方案吗?

我确实尝试过

alert($scope.items == true);

但它总是返回 false ,当对象被创建和填充时$http,所以它不是那样工作的。

4

9 回答 9

199

或者您可以通过执行以下操作来保持简单:

alert(angular.equals({}, $scope.items));
于 2014-05-08T22:21:06.507 回答
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);
    });

});

问候。

于 2014-04-30T19:26:19.343 回答
63

这里不需要使用空对象文字,您可以使用 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
    };
});
于 2013-07-24T16:12:22.843 回答
61

另一个简单的单线:

var ob = {};
Object.keys(ob).length // 0
于 2014-05-21T22:15:19.457 回答
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/

于 2014-06-04T13:54:55.123 回答
7
if( obj[0] )

一个更简洁的版本可能是:

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

如果没有设置对象属性,结果将是未定义的。

于 2015-08-21T16:57:38.353 回答
6

或者,如果使用 lo-dash:_.empty(value)。

“检查值是否为空。长度为 0 的数组、字符串或参数对象以及没有自己的可枚举属性的对象被视为“空”。

于 2014-08-20T18:19:08.707 回答
-2

检查空对象

$scope.isValid = function(value) {
    return !value
}
于 2016-05-24T15:39:24.420 回答
-11

你可以检查项目的长度

ng-show="items.length"
于 2015-09-17T18:17:15.247 回答