检查对象是否为空,是否可以在ng-show中使用,但不能从控制器中使用?


99

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

$scope.items = {};

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

ng-show="items"

并且神奇地起作用了,我也想从控制器上做同样的事情,但是我似乎无法使它起作用,看来我可能不得不遍历该对象以查看它是否具有任何属性或使用lodash或下划线。

有其他选择吗?

我确实尝试过

alert($scope.items == true);

但在创建对象并填充时$http,它始终返回false,因此它不能那样工作。


1
在控制器中,您只是使用javascript,因此将适用以下问题的答案:stackoverflow.com/questions/4994201/is-object-empty
Cyrille Ka

Answers:


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我可以吗?我的印象是我必须创建一个对象
Martin

如果我确实有一个项目= {}; 反正没有从控制器确认这一点吗?当然,这里不会为空。
马丁

1
这个要求不是您的问题,因此我的答案是基于过度简化的情况。如果您确实需要一个对象开始,可以尝试$scope.items = {available: false}ng-show="items.available",然后在控制器中检查if (items.available) {...}
刘烨

谢谢!实际上,我最终使用undefined对其进行了测试,并且效果很好。谢谢。
马丁

@YeLiu如果您想使项目中的项目为空,则不允许您重复两次,angular会抛出异常,告诉您到目前为止,出于我的未知原因,该项目不允许重复。
Burimi 2015年

199

或者,您可以通过执行以下操作来简化操作:

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

我的也是。谢天谢地,我不必重载更多功能来对其进行测试。
吉米·凯恩

1
请注意,对于我的测试(chrome 45),简单的javascript相等也起作用:({} === $scope.items)
JesperRønn-Jensen2015年

嗯,这评估为假,有什么用?({} == {})
chrismarx 2015年

很聪明的办法!一个班轮总是更好的:)
supersan

如果在视图中使用并且将视图模型用作范围,请确保将角度添加到视图模型,即vm.angular.equals({},items)
电影

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
奇迹般有效。感谢分享!
2014年

2
我相信过滤器应该解析内容并返回内容的子集。您所描述的似乎更像是放置在作用域上的函数,而不是过滤器。有关更多信息,请参见docs.angularjs.org/api/ng/filter/filter
kmkm 2014年

4
我认为您正在谈论的是称为filter或'filterFilter'的特定过滤器。角度过滤器可以返回您想要的任何内容,而不仅仅是给定输入的子集。请参阅docs.angularjs.org/api/ng/filter
jcamelis 2014年

61

另一个简单的单线:

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

2
这很优雅,但是您必须在目标浏览器中检查ECMAScript5兼容性。主要的陷阱是,这在IE8中不起作用。
jmgem 2014年

8
作为一种技术,angula并未正式在1.3(开发)分支中支持IE8,也未在1.2(稳定)的docs.angularjs.org/guide/ie上对其进行运行测试 。此外,我们对IE8的支持程度越低,也许它最终会消失。<插入公司反驳>
jaf0 2014年

2
如果您真的必须处理一个空的物体,最好的答案
弯曲状2015年

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

或者,如果使用破折号:_.empty(value)。

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


-2

检查空对象

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

那是错误的。空物体无法像这样进行测试
kaiser

-11

您可以检查物品的长度

ng-show="items.length"

1
我不明白为什么这个答案有-1票?有人可以解释一下吗?
iluu

14
@KarolinaKafel因为items是一个对象而对象没有.length属性(通常)-数组具有它们
llamerr 2015年

2
它不是一个数组花花公子:)
Ghazanfar Khan

@KarolinaKafel不是数组,则items.length始终未定义。
Fabricio'Feb

雅呀,人类犯了错误,-1也会表明这个答案是错误的,为什么是-10?人们长大:)
Aadam
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.