オブジェクトが空かどうかの確認、ng-showでは機能しますが、コントローラーでは機能しませんか?


99

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

$scope.items = {};

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

ng-show="items"

魔法のように機能します。コントローラからも同じようにしたいのですが、機能させることができないようです。プロパティがあるかどうかを確認するためにオブジェクトを反復処理したり、lodashやアンダースコアを使用したりする必要があるようです。 。

代わりはありますか?

私は試しました

alert($scope.items == true);

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


1
コントローラでは、javascriptを使用しているだけなので、この質問の回答が適用されます:stackoverflow.com/questions/4994201/is-object-empty
Cyrille Ka

回答:


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

アイテムがある場合= {}; これをコントローラから確認する方法はありませんか?もちろん、ここではnullにはなりません。
マーティン

1
この要件はあなたの質問には含まれていないので、私の答えは過度に簡略化されたシナリオに基づいています。最初にオブジェクトが本当に必要な場合は、、、を試してみて$scope.items = {available: false}ng-show="items.available"コントローラーでを確認するだけif (items.available) {...}です。
Ye Liu

ありがとう!実際、私はそれを未定義でテストしてしまい、うまくいきました。ありがとう。
マーティン

@YeLiuアイテムのアイテムをnullにしたい場合、それを2回作成することはできません。angularは、これまでのところ未知の理由でコレクション内の複製を許可しないことを示す例外をスローします。
ブリミ

199

または、次のようにすることでシンプルに保つことができます。

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

私も。よろしくお願いします。テストするために関数をオーバーロードする必要はありませんでした。
ジミー・ケイン

1
ちょうどノートは、私のテスト(クロム45)のために、簡単なJavaScriptの平等も働いていた:({} === $scope.items)
ジェスパーロン・ジェンセン

うーん、これはfalseと評価されます。({} == {})
chrismarx 2015

とても賢いアプローチです!1つのライナーは常に優れています:)
supersan '18 / 02/18

ビューで使用し、ビューモデルをスコープとして使用する場合は、必ずビューモデルに角度を追加してください。つまり、vm.angular.equals({}、items)
cinek

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
魅力のように機能します。共有してくれてありがとう!
Chnoch

2
フィルターはコンテンツを解析し、コンテンツのサブセットを返す必要があると思います。あなたが説明することは、フィルターというよりもスコープに置かれた関数のようです。詳細については、docs.angularjs.org / api / ng / filter / filterを参照してください。
kmkm 2014年

4
私は、filterまたは 'filterFilter'と呼ばれる特定のフィルターについて話していると思います。angularのフィルターは、特定の入力のサブセットだけでなく、必要なものを返すことができます。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(dev)ブランチで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

または、lo-dashを使用する場合:_.empty(value)。

「値が空かどうかを確認します。長さが0の配列、文字列、または引数のオブジェクトと、独自の列挙可能なプロパティのないオブジェクトは、「空」と見なされます。」


-2

空のオブジェクトをチェック

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

それは間違っています。空のオブジェクトはそのようにテストできません
カイザー

-11

アイテムの長さを確認できます

ng-show="items.length"

1
この回答の投票数が-1になる理由がわかりませんか?誰かが私にそれについて説明してもらえますか?
iluu 2015年

14
@KarolinaKafel itemsはオブジェクトであり、オブジェクトには.lengthプロパティがありません(通常)-配列にはプロパティがあります
llamerr

2
それは配列の男ではありません:)
Ghazanfar Khan

@KarolinaKafelは配列ではないため、items.lengthは常に未定義です。
ファブリシオ2017

人間が間違いを犯したことをya、-1もこの回答が間違っていることを示したでしょう。人々は成長します:)
Aadam
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.