Angularjs 检查对象是否为空,是否与ng show一起工作,但不从控制器开始?

Angularjs 检查对象是否为空,是否与ng show一起工作,但不从控制器开始?,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我有一个JS对象声明如下 $scope.items = {}; 我还有一个$http请求,它用项目填充这个对象。我想检测此项是否为空,似乎ng show支持此项。。。我进去 ng-show="items" 神奇的是,它可以工作,我也想从一个控制器上做同样的事情,但我似乎无法让它工作,似乎我必须迭代对象,看看它是否有任何属性或使用lodash或下划线 还有别的选择吗 我确实试过了 alert($scope.items == true); 但是,当创建对象并且填充了$http时,它总是返回fa

我有一个JS对象声明如下

$scope.items = {};
我还有一个$http请求,它用项目填充这个对象。我想检测此项是否为空,似乎ng show支持此项。。。我进去

ng-show="items"
神奇的是,它可以工作,我也想从一个控制器上做同样的事情,但我似乎无法让它工作,似乎我必须迭代对象,看看它是否有任何属性或使用lodash或下划线

还有别的选择吗

我确实试过了

alert($scope.items == true);

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

此处不需要使用空对象文本,您可以使用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
    };
});

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

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>

问候。

或者您可以通过这样做来保持简单:

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

另一个简单的一行:

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

如果无法使项目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>
仅当您的浏览器支持ECMAScript 5时。例如,IE8不支持此功能


有关更多信息,请参见,或者,如果使用lo-dash:u.empty(值)

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

更干净的版本可能是:

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

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

您可以检查项目的长度

ng-show="items.length"
检查空对象

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


在一个控制器中,您只是在使用javascript,所以这个问题的答案将适用:您好,谢谢您的回复,但我需要在实际收到来自$http的信息之前设置对象的属性。如果为null,则我无法执行项。available=true我可以吗?我的印象是,如果我有一个items={},我必须创建一个object;是否无论如何都无法从控制器确认这一点?当然这里不是空的。这个要求不在你的问题中,所以我的答案是基于过度简化的场景。如果您确实需要一个对象开始,您可以尝试
$scope.items={available:false}
ng show=“items.available”
,在控制器中只需检查
If(items.available){…}
。谢谢!事实上,我最终用未定义的代码测试了它,效果非常好。谢谢。@YeLiu如果你想在items中设置一个项目为null,你将不能设置两次,angular将抛出一个异常,告诉你由于未知的原因,到目前为止,它不允许在集合中重复。效果很好。谢谢分享!我认为过滤器应该解析内容并返回内容的子集。您所描述的更像是放置在作用域上的函数,而不是过滤器。有关更多信息,请参阅。我认为您所说的是一个名为filter或“filterFilter”的特定过滤器。angular中的过滤器可以返回您想要的任何内容,而不仅仅是给定输入的子集。请参阅。这很优雅,但您必须检查目标浏览器中的ECMAScript 5兼容性。主要的缺陷是这在IE8中不起作用。从技术上讲,angula没有在1.3(开发)分支中正式支持IE8,也没有在1.2(稳定)上运行IE8测试。。。此外,我们越不支持IE8,它可能最终会消失。如果你真的必须处理一个空的objectMine,最好的答案是。谢天谢地,我不需要重载更多的函数来测试它。请注意,对于我的测试(chrome 45),简单的javascript等式也能起作用:
({}===$scope.items)
hmm,这个值为false,给出了什么?({}=={})非常聪明的方法!一行程序总是更好:)如果在视图中使用,并使用视图模型作为作用域,请确保将angular添加到视图模型,即vm.angular.equals({},items)我不明白为什么这个答案有-1票?有人能给我解释一下吗?@KarolinaKafel因为
items
是一个对象,而对象没有
.length
属性(通常)-数组有它们它不是数组dude:)@KarolinaKafel不是数组,那么items.length总是没有定义。是的,人类犯了错误,-1也会表明这个答案是错误的,为什么是-10?人们长大了:)那是错的。空对象不能像那样进行测试
if( typeof Object.keys(obj)[0] === 'undefined' )
ng-show="items.length"
$scope.isValid = function(value) {
    return !value
}