私はそのように宣言されたJSオブジェクトを持っています
$scope.items = {};
このオブジェクトをアイテムで埋める$ httpリクエストもあります。この項目が空かどうかを検出したいのですが、ng-showがこれをサポートしているようです...
ng-show="items"
そして魔法のように動作します。コントローラからも同じことをしたいのですが、動作させることができないようです。 。
代替案はありますか?
やってみた
alert($scope.items == true);
しかし、オブジェクトが作成されたときと$http
が入力されたときは常にfalseを返すので、そのようには機能しません。
ここでは空のオブジェクトリテラルを使用する必要はありません。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
};
});
あるいは、次のようにして単純にすることもできます。
alert(angular.equals({}, $scope.items));
個人的なプロジェクトで、私はこのフィルタを書きました
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);
});
});
よろしくお願いします。
もう一つの単純なワンライナー:
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>
できるよ
var ob = {};
Object.keys(ob).length
ご使用のブラウザがECMAScript 5をサポートしている場合のみ。たとえば、IE 8はこの機能をサポートしません。
詳細については http://kangax.github.io/compat-table/es5/ を参照してください。
if( obj[0] )
これのよりきれいなバージョンは次のようになります。
if( typeof Object.keys(obj)[0] === 'undefined' )
オブジェクトプロパティが設定されていない場合、結果は未定義になります。
または、lo-dashを使用している場合:_.empty(値)。
msgstr "値が空かどうかをチェックします。長さ0の配列、文字列、または引数オブジェクト、そしてそれ自身の列挙可能なプロパティを持たないオブジェクトは"空 "とみなされます。"