it-swarm.asia

التحقق مما إذا كان الكائن فارغًا ، يعمل مع ng-show ولكن ليس من جهاز التحكم؟

لدي كائن JS أعلن مثل ذلك

$scope.items = {};

لدي أيضًا طلب http http يملأ هذا الكائن بالعناصر. أرغب في اكتشاف ما إذا كان هذا العنصر فارغًا ، يبدو أن ng-show يدعم هذا ... أنا أدخل

ng-show="items"

ونجح بطريقة سحرية ، وأود أيضًا أن أفعل نفس الشيء من وحدة تحكم ، لكن لا يبدو لي أن أحصل عليه على ما يبدو ، قد يبدو أنني مضطر للتكرار على الكائن لمعرفة ما إذا كان لديه أي خصائص أو استخدام lodash أو تسطير أسفل السطر .

هل هناك بديل؟

لقد حاولت

alert($scope.items == true);

لكنه دائمًا ما يُرجع خطأ ، وعندما يتم إنشاء الكائن وعند ملؤه بـ $http ، لذلك لا يعمل بهذه الطريقة.

98
Martin

استخدام كائن فارغ حرفي ليس ضروريًا هنا ، يمكنك استخدام فارغة أو غير محددة:

$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
58
jaf0

إذا لم تتمكن من الحصول على العناصر OBJ مساوية للقيمة الخالية ، فيمكنك القيام بذلك:

$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 (value).

"يتم التحقق مما إذا كانت القيمة فارغة. كائنات المصفوفات أو السلاسل أو الوسائط ذات طول 0 والكائنات التي لا تحتوي على خصائص قابلة للتعداد تعتبر" فارغة "."

6
Jeff Pace