关于angularjs:检查对象是否为空,使用ng-show而不是来自控制器?

Checking if object is empty, works with ng-show but not from controller?

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

1
$scope.items = {};

我还有一个$HTTP请求,它用项目填充这个对象。我想检测这个项目是否是空的,似乎ng show支持这个…我进入

1
ng-show="items"

神奇的是,它可以工作,我也希望从一个控制器做同样的事情,但我似乎不能让它工作,似乎我可能需要迭代对象,看看它是否有任何属性,或者使用lodash或下划线。

还有其他选择吗?

我试过了

1
alert($scope.items == true);

但是,当对象被创建并且被$http填充时,它总是返回false,因此它不会以这种方式工作。


或者你可以这样做来保持简单:

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


在一个私人项目中,a编写了这个过滤器

1
2
3
4
5
6
7
8
9
10
11
12
angular.module('myApp')
    .filter('isEmpty', function () {
        var bar;
        return function (obj) {
            for (bar in obj) {
                if (obj.hasOwnProperty(bar)) {
                    return false;
                }
            }
            return true;
        };
    });

用途:

1
2
<p ng-hide="items | isEmpty">Some Content
</p>

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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);
    });

});

当做。


此处不需要使用空对象文本,可以使用空或未定义:

1
$scope.items = null;

这样,ng-show就可以继续工作,在控制器中,您只需执行以下操作:

1
2
3
4
5
if ($scope.items) {
    // items have value
} else {
    // items is still null
}

在您的$http回调中,您执行以下操作:

1
2
3
4
5
6
$http.get(..., function(data) {
    $scope.items = {
        data: data,
        // other stuff
    };
});


另一个简单的一行程序:

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


如果项目obj不能等于空,则可以执行以下操作:

1
2
3
4
$scope.isEmpty = function (obj) {
    for (var i in obj) if (obj.hasOwnProperty(i)) return false;
    return true;
};

在视图中,您可以执行以下操作:

1
 

你可以的

1
2
var ob = {};
Object.keys(ob).length

只有当您的浏览器支持ECMAScript 5时。例如,IE8不支持此功能。

有关更多信息,请参阅http://kangax.github.io/compat-table/es5/。


1
if( obj[0] )

更清晰的版本可能是:

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

如果未设置对象属性,则结果将未定义。


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

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


检查空对象

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


你可以检查物品的长度

1
ng-show="items.length"