web-dev-qa-db-ja.com

オブジェクトが空かどうか調べる、ng-showで動作しますが、コントロールから動作しませんか?

私はそのように宣言されたJSオブジェクトを持っています

$scope.items = {};

このオブジェクトをアイテムで埋める$ httpリクエストもあります。この項目が空かどうかを検出したいのですが、ng-showがこれをサポートしているようです...

ng-show="items"

そして魔法のように動作します。コントローラからも同じことをしたいのですが、動作させることができないようです。 。

代替案はありますか?

やってみた

alert($scope.items == true);

しかし、オブジェクトが作成されたときと$httpが入力されたときは常にfalseを返すので、そのようには機能しません。

98
Martin

ここでは空のオブジェクトリテラルを使用する必要はありません。nullまたは未定義を使用できます。

$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
    };
});
62
Ye Liu

あるいは、次のようにして単純にすることもできます。

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

個人的なプロジェクトで、私はこのフィルタを書きました

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);
    });

});

よろしくお願いします。

71
jcamelis

もう一つの単純なワンライナー:

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

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/ を参照してください。

27
mattia.corci
if( obj[0] )

これのよりきれいなバージョンは次のようになります。

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

オブジェクトプロパティが設定されていない場合、結果は未定義になります。

7
n0mad

または、lo-dashを使用している場合:_.empty(値)。

msgstr "値が空かどうかをチェックします。長さ0の配列、文字列、または引数オブジェクト、そしてそれ自身の列挙可能なプロパティを持たないオブジェクトは"空 "とみなされます。"

6
Jeff Pace