অবজেক্টটি খালি আছে কিনা তা পরীক্ষা করা হচ্ছে, এনজি-শোতে কাজ করে তবে নিয়ামক থেকে নয়?


99

আমার মতো একটি জেএস বিষয় প্রকাশিত হয়েছে

$scope.items = {};

আমার কাছে একটি $ http অনুরোধও রয়েছে যা আইটেমটি দিয়ে এই বস্তুটি পূরণ করে। আমি এই আইটেমটি খালি কিনা তা সনাক্ত করতে চাই, এনজি-শো এটি সমর্থন করে বলে মনে হচ্ছে ... আমি প্রবেশ করি

ng-show="items"

এবং যাদুতে এটি কাজ করে, আমি কন্ট্রোলারের কাছ থেকেও এটি করতে চাই তবে এটি কাজ করায় বলে মনে হচ্ছে না, এটির কোনও বৈশিষ্ট্য রয়েছে কিনা তা দেখতে আমার অবজেক্টের উপর পুনরাবৃত্তি করতে হবে বা লড্যাশ বা আন্ডারস্কোর ব্যবহার করতে পারে ।

বিকল্প আছে?

আমি চেষ্টা করেছিলাম

alert($scope.items == true);

তবে এটি সর্বদা মিথ্যা প্রত্যাবর্তন করে, যখন বস্তুটি তৈরি হয় এবং যখন এটি জনবহুল হয় $http, সুতরাং এটি সেভাবে কাজ করে না।


4
একটি নিয়ামক হিসাবে আপনি কেবল জাভাস্ক্রিপ্ট ব্যবহার করছেন, সুতরাং এই প্রশ্নের উত্তরগুলি প্রযোজ্য: স্ট্যাকওভারফ্লো
সাইরিল কা

উত্তর:


63

আক্ষরিক একটি খালি বস্তু ব্যবহার এখানে প্রয়োজনীয় নয়, আপনি নাল বা অপরিজ্ঞাত ব্যবহার করতে পারেন:

$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 থেকে তথ্য প্রাপ্ত হওয়ার আগে আমাকে অবজেক্টটিতে বৈশিষ্ট্যগুলি সেট করতে হবে। যদি এটি বাতিল হয় তবে আমি আইটেমগুলি করতে পারি না av উপলভ্য = আমি কি সত্য করতে পারি? আমি এই ধারণাটির মধ্যে ছিলাম যে আমাকে একটি অবজেক্ট তৈরি করতে হয়েছিল
মার্টিন

যদি আমার কাছে আইটেম থাকে = {}; কোনও নিয়ামকের কাছ থেকে এটি নিশ্চিত করার মতো কোনও উপায় নেই? অবশ্যই এটি এখানে বাতিল হবে না।
মার্টিন

4
এই প্রয়োজনীয়তাটি আপনার প্রশ্নে নেই, সুতরাং আমার উত্তরটি ওভার সরলীকৃত দৃশ্যের উপর ভিত্তি করে। আপনি কি সত্যিই একটি বস্তু দিয়ে শুরু করার প্রয়োজন হলে, আপনি চেষ্টা করতে পারেন $scope.items = {available: false}, এবং ng-show="items.available", এবং আপনার নিয়ামক মাত্র পরীক্ষা if (items.available) {...}
ইয়ে লিউ

ধন্যবাদ! প্রকৃতপক্ষে আমি এটি পরীক্ষা না করে পরীক্ষা দিয়ে শেষ করেছি এবং এটি দুর্দান্ত কাজ করেছে। ধন্যবাদ
মার্টিন

@ ইয়েলুই আপনি যদি আইটেমগুলিকে নালাগুলি তৈরি করতে চান তবে আপনাকে এটি দ্বিগুণ করার অনুমতি দেওয়া হবে না, কৌণিক একটি ব্যতিক্রম ছুঁড়ে ফেলবে যা আপনাকে বলে যে এটি এখনও পর্যন্ত আমার জন্য অজানা কারণে কোনও সংগ্রহের মধ্যে ডুপকে অনুমতি দেয় না।
বুড়িমি

199

বা আপনি এ জাতীয় কিছু করে সহজ রাখতে পারেন:

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

আমারও। শুভ প্রভু ধন্যবাদ, এটি পরীক্ষা করার জন্য আমাকে আরও ফাংশন ওভারলোড করতে হয়নি।
জিমি কেনে

4
আমার পরীক্ষার জন্য (ক্রোম 45) কেবল একটি নোট, সহজ জাভাস্ক্রিপ্টের ({} === $scope.items)
সমতাটিও

হুম, এই মিথ্যা মূল্যায়ন, কি দেয়? ({} == {})
ক্রিসমার্ক

খুব চালাক পদ্ধতির! একটি লাইনার সর্বদা ভাল :)
সুপারসান

যদি স্কোপ হিসাবে ভিউ মডেলটি দেখায় এবং ব্যবহার করা হয় তবে আপনি মডেলটি দেখতে কৌনিক যুক্ত করেছেন তা নিশ্চিত করুন, যেমন vm.angular.equals ({}, আইটেম)
21

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

});

শ্রদ্ধা।


4
একটি যাদুমন্ত্র মত কাজ করে. ভাগ করে নেওয়ার জন্য ধন্যবাদ!
Chnoch

4
আমি বিশ্বাস করি যে ফিল্টারগুলিকে বিষয়বস্তু বিশ্লেষণ করা উচিত এবং সামগ্রীর একটি উপসেট ফেরত দেওয়া উচিত। আপনি যা বর্ণনা করেছেন তা ফিল্টারের চেয়ে স্কোপে রাখা কোনও ফাংশনের মতো বলে মনে হচ্ছে। আরও তথ্যের জন্য ডকস.আঙ্গুলারজেএস.আর.পিআই / এনজি / ফিল্টার / ফিল্টার দেখুন ।
কিমি কিমি

4
আমি মনে করি আপনি ফিল্টার বা 'ফিল্টারফিল্টার' নামে একটি নির্দিষ্ট ফিল্টার সম্পর্কে কথা বলছেন। কৌণিক একটি ফিল্টার আপনাকে প্রদত্ত ইনপুটটির একটি উপসেট নয়, আপনি যা কিছু চাইবেন তা ফিরিয়ে দিতে পারে। Docs.angularjs.org/api/ng/filter দেখুন ।
jcamelis

61

আরেকটি সহজ ওয়ান-লাইনার:

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

4
এটি মার্জিত, তবে আপনি যে ব্রাউজারগুলিকে লক্ষ্য করছেন সেগুলিতে আপনাকে ECMAScript5 সামঞ্জস্যতা পরীক্ষা করতে হবে। প্রধান ক্ষতি হ'ল এটি আই 8 তে কাজ করবে না।
jmgem

8
প্রযুক্তি হিসাবে, অ্যাঙ্গুলা আনুষ্ঠানিকভাবে 1.8 (দেব) শাখায় আইই 8 সমর্থন করে না, বা 1.2 (স্থিতিশীল) ডকস.আঙ্গুলারজেএস.আর / গাইড / এ এটির জন্য পরীক্ষা চালায় না ... তদুপরি, আমরা কম আইই 8 সমর্থন করি, সম্ভবত এটি অবশেষে অদৃশ্য হয়ে যাবে। <কর্পোরেট রিবুটাল >
োকান

4
সেরা উত্তর যদি আপনার সত্যিই কোনও খালি বস্তু নিয়ে কাজ করতে হয়
chovy

27

যদি আপনার কাছে ওবিজে শূন্যের সমান আইটেম না থাকতে পারে তবে আপনি এটি করতে পারেন:

$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 সমর্থন করে Example উদাহরণস্বরূপ, 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
}

এটা ঠিক ভুল খালি জিনিসগুলি এর মতো পরীক্ষা করা যায় না
কায়সার

-11

আপনি আইটেম দৈর্ঘ্য পরীক্ষা করতে পারেন

ng-show="items.length"

4
আমি বুঝতে পারছি না কেন এই উত্তরে -1 ভোট রয়েছে? কেউ দয়া করে আমাকে ব্যাখ্যা করতে পারেন?
ইলুয়ু

14
@ কারোলিনা কাফেল কারণ itemsএকটি বস্তু এবং বস্তুর .lengthসম্পত্তি নেই (সাধারণত) - অ্যারেগুলি তাদের থাকে
llamerr

4
এটি কোনও অ্যারে ডিউড নয় :)
গজানফার খান

পছন্দ করুন
Fabricio

ইয়া হ্যাঁ, মানুষের ভুল হয়েছে, -১ এছাড়াও দেখিয়ে দিত যে এই উত্তরটি ভুল, কেন -10? মানুষ বড় হয় :)
আডাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.