जाँच अगर वस्तु खाली है, एनजी-शो के साथ काम करता है लेकिन नियंत्रक से नहीं?


99

मेरे पास एक जेएस ऑब्जेक्ट है, ऐसा घोषित किया गया है

$scope.items = {};

मेरा एक $ http अनुरोध भी है जो वस्तुओं के साथ इस वस्तु को भरता है। मैं यह पता लगाना चाहूंगा कि क्या यह आइटम खाली है, ऐसा प्रतीत होता है कि एनजी-शो इस का समर्थन करता है ... मैं दर्ज करता हूं

ng-show="items"

और जादुई रूप से यह काम करता है, मैं एक नियंत्रक से भी ऐसा ही करना चाहूंगा, लेकिन मुझे यह काम करने के लिए नहीं मिल सकता है, ऐसा प्रतीत होता है कि मुझे ऑब्जेक्ट पर यह देखना पड़ सकता है कि क्या यह कोई गुण है या लॉश या अंडरस्कोर का उपयोग करें ।

क्या कोई विकल्प है?

मैंने कोशिश की

alert($scope.items == true);

लेकिन यह हमेशा गलत होता है, जब वस्तु बनाई जाती है और जब आबादी होती है $http, तो वह इस तरह से काम नहीं करता है।


1
एक नियंत्रक में, आप सिर्फ जावास्क्रिप्ट का उपयोग कर रहे हैं, इसलिए इस प्रश्न के उत्तर लागू होंगे: stackoverflow.com/questions/4994201/is-object-empty
Cyrille Ka

जवाबों:


62

खाली वस्तु का उपयोग करें शाब्दिक यहाँ आवश्यक नहीं है, आप अशक्त या अपरिभाषित का उपयोग कर सकते हैं:

$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 से जानकारी मिली है, मुझे ऑब्जेक्ट पर गुण सेट करने की आवश्यकता है। यदि इसकी अशक्तता है तो मैं आइटम नहीं कर सका। अनुपलब्ध = सच मैं कर सकता था? मैं इस धारणा के तहत था कि मुझे एक वस्तु बनानी है
मार्टिन

अगर मेरे पास एक आइटम है = {}; किसी भी नियंत्रक से इसकी पुष्टि करने के लिए वैसे भी नहीं है? बेशक यह यहाँ शून्य नहीं होगा।
मार्टिन

1
यह आवश्यकता आपके प्रश्न में नहीं है, इसलिए मेरा उत्तर सरलीकृत परिदृश्य पर आधारित है। यदि आपको वास्तव में शुरू करने के लिए एक वस्तु की आवश्यकता है, तो आप कोशिश कर सकते हैं $scope.items = {available: false}, और ng-show="items.available", और आपके नियंत्रक में बस जाँच करें if (items.available) {...}
ये लियू

धन्यवाद! वास्तव में मैंने इसे अपरिभाषित के साथ परीक्षण समाप्त कर दिया और इसने बहुत अच्छा काम किया। धन्यवाद।
मार्टिन

@YeLiu यदि आप आइटम में कोई आइटम बनाना चाहते हैं, तो आपको इसे दो बार बनाने की अनुमति नहीं होगी, कोणीय एक अपवाद फेंक देगा जो आपको बताता है कि यह मेरे लिए अब तक अज्ञात कारणों के लिए एक संग्रह के भीतर द्वैध की अनुमति नहीं देता है।
बिरमी

199

या आप कुछ ऐसा करके इसे सरल बना सकते हैं:

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

मेरा भी। धन्यवाद अच्छा स्वामी मुझे इसे परखने के लिए अधिक कार्यों को अधिभार नहीं देना पड़ा।
जिमी केन

1
बस एक नोट, मेरे परीक्षण के लिए (क्रोम 45), सरल जावास्क्रिप्ट समानता ने भी काम किया:({} === $scope.items)
जेस्पर रॉन-जेनन

हम्म, यह असत्य का मूल्यांकन करता है, क्या देता है? ({} == {})
क्रिस्मार्क्स 15

बहुत चतुर दृष्टिकोण! एक लाइनर हमेशा बेहतर होता है :)
सुपरसन

यदि दृश्य मॉडल का उपयोग करें और गुंजाइश के रूप में देखें, तो सुनिश्चित करें कि आप कोणीय मॉडल, अर्थात vm.angular.equals ({}, आइटम) जोड़ें
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
एक जादू की तरह काम करता है। साझा करने के लिए धन्यवाद!
चोंच

2
मेरा मानना ​​है कि फ़िल्टर सामग्री को पार्स करना चाहिए और सामग्री का सबसेट वापस करना चाहिए। आप जो वर्णन करते हैं वह फ़िल्टर की तुलना में कार्यक्षेत्र पर रखे गए कार्य की तरह लगता है। अधिक जानकारी के लिए docs.angularjs.org/api/ng/filter/filter देखें ।
किमी किमी

4
मुझे लगता है कि आप किसी विशेष फ़िल्टर के बारे में बात कर रहे हैं जिसे फ़िल्टर या 'फ़िल्टरफ़िल्टर' कहा जाता है। कोणीय में एक फिल्टर आपको दी गई इनपुट के सिर्फ एक सबसेट नहीं, बल्कि कुछ भी वापस कर सकता है। Docs.angularjs.org/api/ng/filter देखें ।
jcamelis

61

एक और सरल वन-लाइनर:

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

2
यह सुरुचिपूर्ण है, लेकिन आपको उन ब्राउज़र में ECMAScript5 संगतता की जांच करनी होगी जिन्हें आप लक्षित कर रहे हैं। प्रमुख नुकसान यह है कि यह IE8 में काम नहीं करेगा।
jmgem

8
एक तकनीकीता के रूप में, अंगुला 1.3 (देव) शाखा में आधिकारिक तौर पर IE8 का समर्थन नहीं करता है, न ही वे 1.2 (स्थिर) docs.angularjs.org/guide/ie पर इसके लिए परीक्षण चलाते हैं ... इसके अलावा, कम हम IE8 का समर्थन करते हैं, शायद यह अंततः गायब हो जाएगा। <कॉर्पोरेट खंडन> सम्मिलित करें
jaf0

2
सबसे अच्छा जवाब अगर आप वास्तव में एक खाली वस्तु के साथ सौदा करना चाहिए
chovy

27

यदि आपके पास 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/ देखें


7
if( obj[0] )

इसका एक क्लीनर संस्करण हो सकता है:

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

यदि कोई वस्तु संपत्ति निर्धारित नहीं है, तो परिणाम अपरिभाषित होगा।


6

या, अगर लो-डैश का उपयोग कर रहे हैं: _.empty (मान)।

"मान खाली है तो जाँच करता है। 0 की लंबाई के साथ वस्तुओं, तारों, या तर्कों को छोड़ता है और बिना किसी गुण के गुण वाली वस्तुओं को" खाली "माना जाता है।"


-2

खाली वस्तु की जाँच करें

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

यह सिर्फ गलत है। खाली वस्तुओं का परीक्षण उस तरह से नहीं किया जा सकता है
kaiser

-11

आप आइटम की लंबाई की जांच कर सकते हैं

ng-show="items.length"

1
मुझे समझ नहीं आता कि इस उत्तर में -1 वोट क्यों हैं? क्या कोई मुझे समझा सकता है कि कृपया?
इल्वू

14
@KarolinaKafel क्योंकि itemsएक ऑब्जेक्ट है और ऑब्जेक्ट्स के पास .lengthसंपत्ति (आमतौर पर) नहीं है - सरणियों में उनके पास है
लामेलर

2
यह एक सरणी नहीं है यार :)
ग़ज़नफ़र खान

@KarolinaKafel एक सरणी नहीं है तो आइटम्स .length हमेशा अपरिभाषित होती है।
फैब्रिकियो

हां फिर उस मानव ने गलती की, -1 ने यह भी दिखाया कि यह उत्तर गलत है, क्यों -10? लोग बड़े होते हैं :)
आदम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.