আমি ng-if
এবং ng-show
/ এর মধ্যে পার্থক্যটি বোঝার চেষ্টা করছি ng-hide
তবে তারা আমার কাছে একই দেখাচ্ছে।
একটি বা অন্যটি ব্যবহার করার জন্য আমার কী মনে রাখা উচিত?
আমি ng-if
এবং ng-show
/ এর মধ্যে পার্থক্যটি বোঝার চেষ্টা করছি ng-hide
তবে তারা আমার কাছে একই দেখাচ্ছে।
একটি বা অন্যটি ব্যবহার করার জন্য আমার কী মনে রাখা উচিত?
উত্তর:
ngIf
ডিরেক্টিভের অপসারণ বা পুনরায় তৈরি করে DOM একটি অভিব্যক্তি উপর ভিত্তি করে গাছের কিছু অংশ। যদি ngIf
কোনও মিথ্যা মানকে মূল্যায়নের জন্য নির্ধারিত অভিব্যক্তিটি হয় তবে উপাদানটি ডিওএম থেকে সরানো হয়, অন্যথায় উপাদানটির একটি ক্লোনটি ডিওমে পুনরায় প্রবেশ করা হয়।
<!-- when $scope.myValue is truthy (element is restored) -->
<div ng-if="1"></div>
<!-- when $scope.myValue is falsy (element is removed) -->
<div ng-if="0"></div>
যখন কোনও উপাদান ngIf
এর ব্যাপ্তিটি ব্যবহার করে সরানো হয় তখন তা নষ্ট হয়ে যায় এবং উপাদানটি পুনঃস্থাপন করা হলে একটি নতুন সুযোগ তৈরি হয়। সুযোগ মধ্যে নির্মিত ngIf
প্রটোটাইপ ইনহেরিটেন্স ব্যবহার তার পিতা বা মাতা সুযোগ থেকে অধিকারী হয়।
যদি প্যারেন্ট স্কোপটিতে সংজ্ঞায়িত জাভাস্ক্রিপ্ট আদিমকে আবদ্ধ করার ngModel
জন্য ব্যবহার করা ngIf
হয় তবে সন্তানের স্কোপের মধ্যে ভেরিয়েবলের যে কোনও পরিবর্তনগুলি প্যারেন্ট স্কোপের মানকে প্রভাবিত করবে না, যেমন
<input type="text" ng-model="data">
<div ng-if="true">
<input type="text" ng-model="data">
</div>
এই পরিস্থিতিটি সরাতে এবং সন্তানের সুযোগের ভিতরে থেকে পিতামাতার স্কোপটিতে মডেলটি আপডেট করতে, কোনও অবজেক্ট ব্যবহার করুন:
<input type="text" ng-model="data.input">
<div ng-if="true">
<input type="text" ng-model="data.input">
</div>
বা, $parent
প্যারেন্ট স্কোপ অবজেক্টটি উল্লেখ করতে ভেরিয়েবল:
<input type="text" ng-model="data">
<div ng-if="true">
<input type="text" ng-model="$parent.data">
</div>
ngShow
নির্দেশ শো বা চামড়া দেওয়া HTML উপাদান প্রদান করা অভিব্যক্তি উপর ভিত্তি করে ngShow
অ্যাট্রিবিউট। উপাদানটিতে ng-hide
সিএসএস শ্রেণি সরিয়ে বা যুক্ত করে উপাদানটি দেখানো বা লুকানো থাকে । .ng-hide
সিএসএস বর্গ AngularJS মধ্যে পূর্বনির্ধারিত এবং কেউ প্রদর্শন স্টাইল নির্ধারণ করে (একটি ব্যবহার করছে !important
পতাকা)।
<!-- when $scope.myValue is truthy (element is visible) -->
<div ng-show="1"></div>
<!-- when $scope.myValue is falsy (element is hidden) -->
<div ng-show="0" class="ng-hide"></div>
যখন ngShow
অভিব্যক্তিটি মূল্যায়ণ করে false
তখন ng-hide
সিএসএস বর্গটি class
উপাদানটিকে গুপ্ত হওয়ার কারণের বৈশিষ্ট্যে যুক্ত করা হয় । যখন true
, ng-hide
উপাদানটি গোপন প্রদর্শিত না হওয়ার কারণে উপাদানটি থেকে সিএসএস শ্রেণি সরানো হয়।
data.input
... তবে data
মডেলটিতে একা কাজ করে না। @ কোডেটার
ngIf
একটি নতুন সুযোগ তৈরি করে, তাই নীড়ের উপরে উদাহরণটি দেখলে ngModel
একটি নতুন data
মডেল তৈরি হবে যদিও একই নামে একটি মডেল প্যারেন্ট স্কোপের মধ্যে রয়েছে। আপনি যখন কোনও ডট স্বরলিপি ব্যবহার করেন, তখন আপনি জেএসকে স্কোপের প্রোটোটাইপ চেইনটি সন্ধান করেন। সুতরাং যদি এটি বর্তমান সুযোগে মানটি না খুঁজে পায় তবে এটি এটি প্যারেন্ট স্কোপ এবং এটির জন্য অনুসন্ধান করার চেষ্টা করবে। কয়েক অন্যান্য নির্দেশনা যে একটি ভিন্ন সুযোগ তৈরি হয় ngInclude
, ngRepeat
। আশা করি এটি এখন পরিষ্কার হয়ে যাবে। :)
হতে পারে একটি আকর্ষণীয় বিন্দু, উভয় মধ্যে অগ্রাধিকার মধ্যে পার্থক্য।
আমি যতদূর বলতে পারি, এনজি-ইফ ডাইরেক্টিভের সমস্ত কৌণিক নির্দেশগুলির মধ্যে একটি সর্বোচ্চ (সর্বোচ্চ না হলে) অগ্রাধিকার রয়েছে। যার অর্থ: এটি অন্যান্য, নিম্ন অগ্রাধিকারপ্রাপ্ত, নির্দেশাবলীর আগে FIRST চালাবে। এটি প্রথম চলমান, এর অর্থ হল কার্যকরভাবে কোনও অভ্যন্তরীণ নির্দেশাবলীর প্রক্রিয়া করার আগে উপাদানটি সরানো হবে । বা কমপক্ষে: এটি আমি এটি তৈরি করি।
আমি আমার বর্তমান গ্রাহকের জন্য তৈরি ইউআইতে এটি পর্যবেক্ষণ করেছি এবং ব্যবহার করেছি। পুরো ইউআইটি বেশ ভারীভাবে প্যাক করা হয়েছে এবং এটিতে পুরো এনজি-শো এবং এনজি-লুকানো ছিল। খুব বেশি বিশদে যাওয়ার জন্য নয়, তবে আমি একটি জেনেরিক উপাদান তৈরি করেছি, যা জেএসওএন কনফিগারেশন ব্যবহার করে পরিচালিত হতে পারে, তাই আমাকে টেমপ্লেটের অভ্যন্তরে কিছুটা পরিবর্তন করতে হয়েছিল। একটি এনজি-রিপিট উপস্থিত রয়েছে, এবং এনজি-রিপিটের অভ্যন্তরে একটি টেবিল দেখানো হয়েছে, এতে প্রচুর এনজি-শো, এনজি-হাইডস এমনকি এনজি-সুইচ উপস্থিত রয়েছে। তারা তালিকায় কমপক্ষে ৫০ টি পুনরাবৃত্তি প্রদর্শন করতে চেয়েছিল, যার ফলশ্রুতিতে আরও কম বা কম 1500-2000 দিকনির্দেশনা সমাধান হতে পারে। আমি কোডটি যাচাই করেছি, এবং জাভা ব্যাকএন্ড + কাস্টম জেএসটি ডেটা প্রসেস করতে প্রায় 150 মিমি লাগবে এবং তারপরে অ্যাংুলার প্রদর্শিত হওয়ার আগে এটিতে প্রায় 2-3 সেকেন্ড চিবিয়ে খায়। গ্রাহক কোনও অভিযোগ করেননি, তবে আমি হতবাক হয়েছিল :-)
আমার সন্ধানে, আমি এনজি-ইফ-নির্দেশের উপর দিয়ে হোঁচট খেয়েছি। এখন, সম্ভবত এটি উল্লেখ করা ভাল যে এই ইউআই অনুমান করার সময়ে, কোনও এনজি-যদি পাওয়া যায় নি। যেহেতু এনজি-শো এবং এনজি-লুকের মধ্যে তাদের ফাংশন ছিল, যা বুলিয়ানদের ফিরিয়ে দিয়েছে, আমি সহজেই তাদের সবগুলি এনজি-ইফ দ্বারা প্রতিস্থাপন করতে পারি। এটি করে, সমস্ত অভ্যন্তরীণ নির্দেশাবলীর আর মূল্যায়ন করা হবে না বলে মনে হয়েছিল। এর অর্থ এই যে আমি মূল্যায়িত হওয়া সমস্ত দিকনির্দেশনার প্রায় এক তৃতীয়াংশে ফিরে এসেছি এবং এভাবে ইউআই গতিবেগ প্রায় 500ms - 1 সেকেন্ড লোডিংয়ের সময় পর্যন্ত করেছে। (আমার কাছে সঠিক সেকেন্ড নির্ধারণের কোনও উপায় নেই)
মনে রাখবেন: নির্দেশিকাগুলির মূল্যায়ন হয় না এমনটি হ'ল নীচে কী ঘটছে সে সম্পর্কে শিক্ষিত অনুমান।
সুতরাং, আমার মতে: আপনার যদি উপাদানটি পৃষ্ঠায় উপস্থিত হওয়ার প্রয়োজন হয় (যেমন: উপাদানটি পরীক্ষা করার জন্য, বা যা কিছু আছে) তবে কেবল লুকানো থাকে, এনজি-শো / এনজি-লুকান ব্যবহার করুন। অন্যান্য সমস্ত ক্ষেত্রে এনজি-ইফ ব্যবহার করুন।
ng-if
ডিরেক্টিভের পাতা থেকে বিষয়বস্তু সরিয়ে ফেলবে এবং ng-show/ng-hide
CSS এর ব্যবহার display
লুকান সামগ্রীতে সম্পত্তি।
আপনি যদি ব্যবহার করতে চান :first-child
এবং :last-child
সিউডোর সিলেক্টরদের স্টাইল করতে চান তবে এটি কার্যকর ।
@ এডস্পেন্সারটি সঠিক। আপনার যদি প্রচুর উপাদান থাকে এবং আপনি কেবল প্রাসঙ্গিকদের তাত্পর্যপূর্ণ করতে এনজি-ইফ ব্যবহার করেন তবে আপনি সংস্থানগুলি সঞ্চয় করছেন। @ কোডেটারও কিছুটা সঠিক, আপনি যদি কোনও উপাদান সরিয়ে ফেলতে এবং খুব ঘন ঘন দেখাতে থাকেন তবে এটি অপসারণের পরিবর্তে এটি আড়াল করা পারফরম্যান্সে উন্নতি করতে পারে।
এনজি-ইফ-এর জন্য আমি যে প্রধান ব্যবহারের সন্ধান পাই তা হ'ল বিষয়বস্তুগুলি অবৈধ হলে এটি আমাকে একটি উপাদানকে পরিষ্কারভাবে বৈধতা এবং নির্মূল করতে দেয়। উদাহরণস্বরূপ আমি একটি নাল চিত্রের নামের পরিবর্তনশীলটিকে উল্লেখ করতে পারি এবং এটি একটি ত্রুটি ছুঁড়ে দেবে তবে আমি যদি এনজি-ইফ করে পরীক্ষা করি এবং এটি নাল হয় তবে তা সব ভাল। যদি আমি কোনও এনজি-শো করি তবে ত্রুটিটি তখনও আগুন ধরিয়ে দেবে।
এনজি-ইফ এবং এনজি-শো সম্পর্কে একটি গুরুত্বপূর্ণ বিষয় লক্ষণীয় হ'ল ফর্ম নিয়ন্ত্রণগুলি ব্যবহার করার সময় ng-if
এটি ব্যবহার করা ভাল কারণ এটি ডোম থেকে উপাদানটিকে পুরোপুরি সরিয়ে দেয়।
এই পার্থক্যটি গুরুত্বপূর্ণ কারণ আপনি যদি একটি ইনপুট ক্ষেত্রটি তৈরি করেন required="true"
এবং ng-show="false"
এটি লুকিয়ে রাখার জন্য সেট করেন, ব্যবহারকারী যখন ফর্মটি জমা দেওয়ার চেষ্টা করবেন তখন ক্রোম নিম্নলিখিত ত্রুটিটি ফেলে দেবে:
An invalid form control with name='' is not focusable.
ইনপুট ক্ষেত্র হবার কারণটি উপস্থিত এবং এটি হ'ল required
যেহেতু এটি লুকানো রয়েছে ক্রোম এতে ফোকাস করতে পারে না। এই ত্রুটি স্ক্রিপ্টের কার্যকারিতা বন্ধ করে দেওয়ার কারণে এটি আপনার কোডটি আক্ষরিকভাবে ভেঙে দিতে পারে। তাই সতর্কতা অবলম্বন করা!
@ গাজুস কুইজিনাস এবং @ কোডে হ্যাটার সঠিক। এখানে আমি একটি উদাহরণ দিচ্ছি। আমরা যখন এনজি-ইফ দিয়ে কাজ করছি, যদি নির্ধারিত মানটি মিথ্যা হয় তবে পুরো এইচটিএমএল উপাদানগুলি ডিওএম থেকে সরানো হবে। এবং যদি নির্ধারিত মানটি সত্য হয় তবে এইচটিএমএল উপাদানগুলি ডিওমে প্রদর্শিত হবে। এবং স্কোপ পিতামাতার সুযোগের তুলনায় আলাদা হবে। তবে এনজি-শোয়ের ক্ষেত্রে এটি নির্ধারিত মানের উপর ভিত্তি করে উপাদানগুলি প্রদর্শন এবং আড়াল করবে। তবে এটি সর্বদা ডিওমে থাকে। নির্ধারিত মান অনুযায়ী কেবল দৃশ্যমানতা পরিবর্তন হয়।
http://plnkr.co/edit/3G0V9ivUzzc8kpLb1OQn?p=preview
আশা করি এই উদাহরণটি আপনাকে স্কোপগুলি বুঝতে সাহায্য করবে। এনজি-শো এবং এনজি-ইফকে মিথ্যা মান দেওয়ার চেষ্টা করুন এবং কনসোলে ডিওএমটি পরীক্ষা করুন। ইনপুট বাক্সগুলিতে মানগুলি প্রবেশ করার চেষ্টা করুন এবং পার্থক্যটি পর্যবেক্ষণ করুন।
<!DOCTYPE html>
<input type="text" ng-model="data">
<div ng-show="true">
<br/>ng-show=true :: <br/><input type="text" ng-model="data">
</div>
<div ng-if="true">
<br/>ng-if=true :: <br/><input type="text" ng-model="data">
</div>
{{data}}
সত্য, এই ng-if
নির্দেশের বিপরীতে ng-show
, নিজস্ব ক্ষেত্র তৈরি করে, আকর্ষণীয় ব্যবহারিক পার্থক্যের দিকে পরিচালিত করে:
angular.module('app', []).controller('ctrl', function($scope){
$scope.delete = function(array, item){
array.splice(array.indexOf(item), 1);
}
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app='app' ng-controller='ctrl'>
<h4>ng-if:</h4>
<ul ng-init='arr1 = [1,2,3]'>
<li ng-repeat='x in arr1'>
{{show}}
<button ng-if='!show' ng-click='show=!show'>Delete {{show}}</button>
<button ng-if='show' ng-click='delete(arr1, x)'>Yes {{show}}</button>
<button ng-if='show' ng-click='show=!show'>No</button>
</li>
</ul>
<h4>ng-show:</h4>
<ul ng-init='arr2 = [1,2,3]'>
<li ng-repeat='x in arr2'>
{{show}}
<button ng-show='!show' ng-click='show=!show'>Delete {{show}}</button>
<button ng-show='show' ng-click='delete(arr2, x)'>Yes {{show}}</button>
<button ng-show='show' ng-click='show=!show'>No</button>
</li>
</ul>
<h4>ng-if with $parent:</h4>
<ul ng-init='arr3 = [1,2,3]'>
<li ng-repeat='item in arr3'>
{{show}}
<button ng-if='!show' ng-click='$parent.show=!$parent.show'>Delete {{$parent.show}}</button>
<button ng-if='show' ng-click='delete(arr3, x)'>Yes {{$parent.show}}</button>
<button ng-if='show' ng-click='$parent.show=!$parent.show'>No</button>
</li>
</ul>
</div>
প্রথম তালিকায়, on-click
ইভেন্ট, show
ভেরিয়েবল, অভ্যন্তরীণ / নিজস্ব স্কোপ থেকে পরিবর্তন করা হয়েছে, তবে একই নামের সাথে বাইরের স্কোপ ng-if
থেকে অন্য ভেরিয়েবলের দিকে নজর রাখছেন , সুতরাং সমাধানটি কার্যকর হয় না। আমাদের ক্ষেত্রে কেবলমাত্র একটি পরিবর্তনশীল রয়েছে, এজন্য এটি কার্যকর হয়। প্রথম প্রচেষ্টা ঠিক করতে, আমাদের পিতামাতাকে / বাইরের স্কোপ থেকে রেফারেন্স করা উচিত ।ng-show
show
show
$parent.show
এনজি-যদি মিথ্যা হয় তা ডিওএম থেকে উপাদানগুলি সরিয়ে ফেলবে। এর অর্থ হ'ল আপনার সমস্ত ইভেন্ট, সেই উপাদানগুলির সাথে সংযুক্ত নির্দেশাবলী হারিয়ে যাবে। উদাহরণস্বরূপ, শিশু উপাদানগুলির মধ্যে একটিতে এনজি-ক্লিক করুন, যখন এনজি-যদি মিথ্যা হিসাবে মূল্যায়ন করা হয়, সেই উপাদানটি ডিওএম থেকে সরানো হবে এবং যখন এটি সত্য হয় এটি পুনরায় তৈরি করা হবে।
এনজি-শো / এনজি-লুকান ডিওএম থেকে উপাদানগুলি সরিয়ে দেয় না। এটি উপাদানগুলি আড়াল / প্রদর্শন করতে সিএসএস শৈলী (.ng-hide) ব্যবহার করে। এইভাবে আপনার ইভেন্টগুলি, বাচ্চাদের সাথে সংযুক্ত থাকা নির্দেশগুলি হারাবে না।
এনজি-ইফ একটি বাচ্চার সুযোগ তৈরি করে যখন এনজি-শো / এনজি-হাইড করে না।
এনজি-শো এবং এনজি-হাইড বিপরীত উপায়ে কাজ করে। এনজি-হাইড বা এনজি-শোয়ের মধ্যে পার্থক্যটি এনজি-যদি হয়, আমরা যদি এনজি-ইফ ব্যবহার করি তবে ডোমটিতে এলিমেন্ট তৈরি হবে তবে এনজি-হাইড / এনজি-শো এলিমেন্টের সাথে সম্পূর্ণ লুকানো থাকবে।
ng-show=true/ng-hide=false:
Element will be displayed
ng-show=false/ng-hide=true:
element will be hidden
ng-if =true
element will be created
ng-if= false
element will be created in the dom.
মনে রাখবেন, আমার কাছে এখন একটি ঘটনা ঘটেছে: এনজি-শো কনটেন্টটি CSS এর মাধ্যমে লুকিয়ে রাখে, হ্যাঁ, তবে এটি ডিভের বোতাম বলে মনে করার কারণে অদ্ভুত বিভ্রান্তির সৃষ্টি হয়েছিল।
আমার নীচে দুটি বোতাম সহ একটি কার্ড ছিল এবং প্রকৃত অবস্থার উপর নির্ভর করে একটির তৃতীয়টির সাথে এক্সচেঞ্জ হয়, উদাহরণস্বরূপ নতুন এন্ট্রি সহ সম্পাদনা বোতাম। বাম দিকটি লুকানোর জন্য এনজি-শো = মিথ্যা ব্যবহার করে (ফাইলটিতে প্রথমে উপস্থিত) এটি ঘটেছিল যে নীচের বোতামটি কার্ডের বাইরে ডান সীমানা দিয়ে শেষ হয়েছিল। এনজি-ইফ কোডগুলি একেবারেই অন্তর্ভুক্ত না করে এটি ঠিক করে। (এনজি-শোয়ের পরিবর্তে এনজি-ইফ ব্যবহার করে কিছু লুকানো চমক রয়েছে কিনা তা এখানে সন্ধান করা হয়েছে)
এনজিআইএফটি উপাদানটি সরিয়ে বা পুনঃনির্মাণের মাধ্যমে ডিওমে একটি হেরফের তৈরি করে।
অন্যদিকে এনজি শো জিনিসগুলি আড়াল / দেখানোর জন্য CSS নিয়ম প্রয়োগ করে।
বেশিরভাগ ক্ষেত্রে (সর্বদা নয়) আমি এর সংক্ষিপ্তসার হিসাবে বলব, যদি আপনার জিনিসগুলি প্রদর্শন / আড়াল করার জন্য একবারের চেক ng-if
প্রয়োজন হয় তবে ব্যবহার করুন , যদি আপনাকে পর্দায় ব্যবহারকারীর ক্রিয়াকলাপের উপর ভিত্তি করে জিনিসগুলি দেখানোর / আড়াল করার প্রয়োজন হয় (যেমন পরীক্ষা করা হয়েছে) তারপরে একটি চেকবাক্স পাঠ্যবাক্স প্রদর্শন করে, চেক না করে চেক করে পাঠ্যবাক্স গোপন করুন ইত্যাদি)), তারপরে ব্যবহার করুনng-show
এনজি-ইফ এবং এনজি-শোতে একটি আকর্ষণীয় পার্থক্য হ'ল:
নিরাপত্তা
এনজি-ইফ ব্লকের মধ্যে উপস্থিত ডোম উপাদানগুলি এর মান মিথ্যা হিসাবে রেন্ডার হবে না
এনজি-শো-এর ক্ষেত্রেও ব্যবহারকারী আপনার পরিদর্শনকারী এলিমি উইন্ডোটি খুলতে পারে এবং এর মানটি সত্যে সেট করতে পারে।
এবং একটি চাবুকের সাহায্যে গোপনীয়তা বোঝানো পুরো সামগ্রী প্রদর্শিত হবে যা একটি সুরক্ষা লঙ্ঘন। :)
ng-if
মডেলটি দিয়ে নিজেই এইচটিএমএল উপাদানটি সরিয়ে , যুক্ত করেng-model
, আর অস্তিত্ব নেই।