এনজি-ডিপ এর জায়গায় কী ব্যবহার করবেন


93

আমি রাউটার আউটলেট দ্বারা কৌনিক মধ্যে স্থাপন করা একটি উপাদান স্টাইল করার চেষ্টা করছি এবং নিশ্চিত করতে চাই যে উত্পন্ন উপাদানটি 100% প্রস্থ হয়ে যায়

বেশিরভাগ জবাব থেকে, আমি দেখছি যে আমার ::ng-deepনির্বাচকটি ব্যবহার করা উচিত , তবে অ্যাংুলারের ডক্স থেকে এটি হ্রাস করা হচ্ছে। এর বিকল্প আছে কি ::ng-deep?


4
::ng-deepকোথাও যাচ্ছে না। এটি সর্বদা আপনি সক্ষম করতে পারবেন এমন একটি সেটিং হবে। বিশাল সম্প্রদায়ের প্রতিক্রিয়া ছাড়াই এখন তারা এটিকে সরাতে পারে এমন কোনও উপায় নেই। Github.com/search?q=%3A%3Ang-दीप অ্যান্ড টাইপ= কোডের জন্য এই ফলাফলের জন্য কতগুলি ফলাফল ফিরে আসবে তা দেখুন - CSS এর !importantসম্পত্তিটি অদৃশ্য হয়ে যাচ্ছে বলে মনে হচ্ছে
সাইমন_উইভার

আমি জানি না - আমি আমাদের মনো-রেপোতে (একাধিক মোটামুটি বৃহত এন্টারপ্রাইজ অ্যাপ্লিকেশন) কৌতূহল ছাড়াই একটি প্রকল্প-ব্যাপী অনুসন্ধান করেছি এবং কেবল 69৯ টি রেফারেন্স নিয়ে এসেছি। আমি অনুভব করি যে অবচয় থেকে দূরে সরে যাওয়ার জন্য এটি অবশ্যই একটি গ্রহণযোগ্য চুল্লী এবং যখনই তারা বিকল্পটি বের করে আনবে আনন্দের সাথে এটি করবে। এছাড়াও, !importantসিএসএস অনুচ্ছেদে একটি গুরুত্বপূর্ণ স্থান রয়েছে যেখানে ::deepসর্বদা কেবল একটি প্রস্তাব ছিল।
দোয়াদওয়াদ

উত্তর:


103

এফডাব্লুআইডাব্লু আমার গবেষণায় আমি এনজি-ডিপ বা অন্যান্য প্রযোজ্য বিকল্পগুলির কোনও প্রতিস্থাপন খুঁজে পাইনি। এটি কারণ, আমি বিশ্বাস করি, কৌণিক দলটি ছায়া ডোমের উপর ডাব্লু 3 সি অনুচ্ছেদে পিছিয়ে যাচ্ছে, যার প্রথমদিকে নির্বাচক ছিল deep। যাইহোক, ডাব্লু 3 সি এর পরে থেকে প্রস্তাবটি সরিয়ে নিয়েছে, তবে এটি কোনও নতুন দিয়ে প্রতিস্থাপন করে নি। যতক্ষণ না ঘটে ততক্ষণ আমি কল্পনা করি যে কৌণিক দলটি রাখবে ::ng-deepএবং এর বিকল্পগুলি পাওয়া যাবে, তবে ডাব্লু 3 সি এর খসড়াগুলির বিচারাধীন অবস্থার কারণে অবহেলিত অবস্থায় রয়েছে। এখনই এটি ব্যাক আপ করার জন্য ডকুমেন্টেশনগুলি সন্ধান করতে আমি সময় নিতে পারছি না তবে আমি সম্প্রতি তা দেখেছি।

দীর্ঘ গল্প সংক্ষিপ্ত: ব্যবহার চালিয়ে যান ::ng-deep প্রতিস্থাপন তৈরি হওয়া অবধি এবং এর বিকল্পগুলি অব্যাহত - অবচয় হ'ল একটি প্রাথমিক বিজ্ঞপ্তি যাতে প্রকৃত পরিবর্তনটি যখনই বাস্তবায়িত হয় তখন লোকেরা অন্ধ হয়ে না যায়।

- আপডেট -

https://drafers.csswg.org/css-scoping-1/ আপনার আগ্রহী হলে এই খসড়া প্রস্তাবটি এখানে দেওয়া হল। দেখা যাচ্ছে যে তারা ছায়া ডোম গাছের মধ্যে থাকা উপাদানগুলির জন্য নির্বাচকদের একটি শক্তিশালী সেটে কাজ করছেন; এটি এই অনুমান, একবার অনুমোদিত, আমি মনে করি যে কৌণিক ক্লোনটি অবহিত করবে, এমনকি যদি এমন একটি থাকে (যেমন কৌণিকগুলি ব্রাউজারগুলিতে লাইভ হয়ে যাওয়ার পরে তাদের নিজস্ব নির্বাচকগুলি প্রয়োগ করার প্রয়োজন নাও পারে)।


আমি এটির সাথে একমত, তবে আমি অবহিত ফ্রেমওয়ার্ক (এবং ব্রাউজার) কার্যকারিতাটি ব্যবহার করে নতুন কোড লেখার পরামর্শ দেব না।
এম 07

7
হয় হয় আমি। কিন্তু কোন বিকল্প নেই, যা আমি মনে করি এখানে ব্যর্থভাবে পরিষ্কারভাবে বর্ণিত। এটিতে সহায়তা করার জন্য আপনার কোনও পরামর্শ আছে?
দুদেওয়াদ

4
আমি দ্রুত ভাবতে পারি এমন একমাত্র বিকল্পটি হ'ল উপাদানগুলির বাসা বাঁধাকে রিফ্যাক্টর করা হবে যা আপনার জন্য সময় চেয়ে বেশি কাজ হতে পারে তবে অন্য উপকার পেতে পারে ...
এম 06

32
তৃতীয় পক্ষের লাইব্রেরির ::ng-deepসাথে একবারে একবার ব্যবহার করা এড়ানো কার্যত অসম্ভব (যদি আপনি নিজের সাইটটি কীভাবে দেখায় সে সম্পর্কে মোটামুটি যত্নশীল হন) - এমনকি কৌণিক উপাদানের মতো কিছু রয়েছে। তাদের বাগ রয়েছে যা কয়েক মাসের জন্য স্থির থাকে না এবং প্রায়শই এনজি-গভীর থাকে। এবং পৃথক অবহিত 'গভীর' নির্বাচকদের গুলিয়ে ফেলবেন না - ::ng-deepএটি অবশ্যই সর্বনিম্ন প্রত্যাখ্যানিত একজন।
সাইমন_উইভার

4
হ্যাঁ এটি পুরো সিস্টেমের একটি কুৎসিত অংশ। তবে এনক্যাপসুলেশন হ'ল এনক্যাপসুলেশন। আপনাকে স্পষ্টভাবে :: এনজি-ডিপ-ইন সিএসএস ব্যবহার করে বাউন্ডারিটি ভেঙে ফেলতে হবে, অথবা আপনার এটি অগ্রগতিমূলকভাবে করা দরকার। কোন উপাদানটি (অর্থাত্ প্রসঙ্গ) কী "মোড" থাকে তা নির্দেশ করার জন্য আমরা মাঝে মাঝে উপাদান ট্যাগটিতে একটি বৈশিষ্ট্য ব্যবহার করি এবং তারপরে শৈলীগুলি শিশু উপাদানটিতে ডাব্লু / ও :: এনজি-গভীরে কোনও বৈশিষ্ট্য নির্বাচকের মাধ্যমে বাঁচতে পারে: :host[some-context] {}- এটি আপনি কী ধরনের নমনীয়তা / বহনযোগ্যতা চান তার উপর নির্ভর করে। আমি কোনওভাবেই সুপার পছন্দ করি না তবে এটি হ'ল এনক্যাপসুলেশন।
দুদেওয়াদ

20

অবহেলিতকে বাইপাস করতে ::ng-deep, আমি সাধারণত অক্ষম করি ViewEncapsulation। যদিও এটি সেরা পদ্ধতির নয়, এটি আমার ভালভাবে পরিবেশন করেছে।

অক্ষম করতে ViewEncapsulation, আপনার উপাদানগুলিতে নিম্নলিখিতটি করুন:

import { Component, ViewEncapsulation } from '@angular/core';

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.scss'],
  encapsulation: ViewEncapsulation.None
})

export class HeaderComponent {

}

এটি পুরো উপাদানটিতে এই উপাদানটিতে। এসএসএস শৈলী তৈরি করবে। শৈলগুলি পিতামাতা ও ভাইবোন উপাদানগুলিতে শৃঙ্খলে যেতে না দেওয়ার জন্য, নির্বাচকের সাথে পুরো স্কেসটি এমনভাবে মোড়ানো:

app-header {
  // your styles here and any child component styles can go here
}

এখন, এখানে বর্ণিত শৈলীগুলি শিশুদের উপাদানগুলিতে নেমে যাবে যাতে আপনার সিএসএস নির্বাচকদের সাথে অতিরিক্ত নির্দিষ্ট হতে হবে এবং সিএসএস যুক্ত করার সময় আপনার পি এবং কি'র বিষয়টি বিবেচনা করতে হবে (সম্ভবত আপনার কৌনিক অ্যাপে নির্দিষ্ট করা বাছাইকারী নির্বাচক এবং তার স্টাইলগুলি যুক্ত করুন)।

আমি বলছি উপরের অনুচ্ছেদের কারণে এটি সর্বোত্তম পন্থা নয়, তবে এটি আমাকে ভালভাবে উপস্থাপন করেছে।


12
এটি কেবলমাত্র কার্যকর এবং যদি আপনার কাছে বিশাল প্রকল্প থাকে তবে ViewEncapsulationএই স্টাইলগুলি সমস্ত উপাদানগুলিতে ফাঁস করে দেওয়া সম্ভব করে স্যুইচিং অফ করা অনেক ক্ষতি করে damage এই বৈশিষ্ট্যটি বুদ্ধিমানের সাথে এবং সম্পূর্ণ বোঝার সাথে ব্যবহার করা উচিত
এমপ্রো

4
@ এমপ্রো আমি বুঝতে পেরেছি, সে কারণেই আমি ক্যাভিয়েট দিয়েছি এবং বলছি এটি সর্বোত্তম পদ্ধতির নয় এবং আপনাকে আপনার পি এবং কি সম্পর্কে মনে রাখতে হবে এবং আপনাকে অতিরিক্ত নির্দিষ্ট হতে হবে। আমার জন্য, এই পদ্ধতির এখনও পর্যন্ত ভাল কাজ করেছে। :: এনজি-ডিপ অবমূল্যায়নের জন্য চিহ্নিত করা হয়েছে এবং এটি একান্ত কার্যনির্বাহী।
AliF50

4
সত্যিই আমি মনে করি যে হুমকীহীন হতাশার কারণে আপনি যদি এটি করেন তবে এটি পৌঁছানোর ভয়াবহ সিদ্ধান্তে পৌঁছাবেন। হ্যাঁ আমি জানি আপনি ততটা স্বীকার করেছেন তবে আমি সত্যিই মনে করি আপনি এটি করে নিজেকে পায়ে গুলি করছেন। ভিউ এনক্যাপসুলেশন অনেক কারণেই এত কার্যকর। তবে এটি প্রায় ততটা খারাপ নয় কারণ যে কেউ কৌণিক দলের যিনি কোনও যৌক্তিক কাজ ছাড়াই এটিকে ত্যাগ করেছিলেন এবং অনেককেই বিভ্রান্তির দিকে নিয়ে যান। দিনের শেষে আপনি এখনও ওয়েব ব্রাউজারের জন্য কোড লিখছেন - কোনও ধরণের মালিকানা কৌণিক ইঞ্জিন নয়।
সাইমন_উইভার

4
@ সিমন_আমি আপনার মতামতকে শ্রদ্ধা করি এবং ভাগ করে নেওয়ার জন্য ধন্যবাদ। আমি কেবল এটিকে ছাড়িয়ে যাচ্ছি কারণ হতাশাকে হ্রাস করার জন্য এটিই আমি ব্যবহার করি। আমিও সাবধান করেছিলাম
AliF50

4
@ AliF50 "সার্কেমভেন্টিং অবস্ট্রেশন" আসলে কোনও জিনিস নয়। এখানে আসল সমস্যাটি হ'ল এবং আমি আমার জীবনে এর আগে কখনও দেখিনি, তারা বিকল্পটির নাম না দিয়ে এটিকে অবহেলা করেছিলেন । আমার উত্তরটি (উপরে স্বীকৃত কোনওটি) আমার অনুমানের ব্যাখ্যা দেয় যে কেন তারা অনুমানের সাথে সারিবদ্ধ হওয়ার জন্য (ডাব্লু 3 সি এটিকে অবমূল্যায়ন করেছিল)। তবে, আপনি যদি প্রস্তাবগুলি পড়ে থাকেন তবে মনে হচ্ছে :: এনজি-ডিপকে একটি উপযুক্ত বিকল্পের সাথে প্রতিস্থাপন করা হবে যার অর্থ এটি যখন সহজলভ্য হয়, আপনি কেবল আপনার :: এনজি-গভীর রেফারেন্সগুলি আপডেট করেন, বরং আপনার পদ্ধতির পরিবর্তে যা আক্ষরিক জন্য আহ্বান করে সম্পূর্ণ অ্যাপ্লিকেশন পুনরায় স্থপতি।
দুদেওয়াদ

14

গভীর শৈলীর সহজ এবং সহজ বিকল্প হ'ল অভিভাবক উপাদানটির উপাদান নির্বাচক ব্যবহার করে একটি সাধারণ শৈলী। তাই আপনার যদি নায়ক-বিবরণ ডটকম ডেস্কটপ।

:host ::ng-deep h3 {
  font-style: italic;
}

এটি স্টাইলস সিএসএসে এটি হয়ে উঠবে:

app-hero-details h3 {
  font-style: italic;
}

মূলত একটি গভীর শৈলী একটি আন-এনক্যাপসুলেটেড শৈলী তাই ধারণাগতভাবে এটি আমার কাছে উপাদান শৈলীর চেয়ে সাধারণ শৈলীর মতো মনে হয়। ব্যক্তিগতভাবে আমি আর গভীর শৈলী ব্যবহার করব না। প্রধান সংস্করণ আপডেটগুলিতে ব্রেকিং পরিবর্তনগুলি স্বাভাবিক এবং প্রত্যাশিত বৈশিষ্ট্য অপসারণটি ন্যায্য খেলা।


4
বাহ, আমি এখন বোবা বোধ করছি। ধন্যবাদ! অন্যান্য সামনের-শেষ ফ্রেমওয়ার্কগুলি থেকে এসে আমি ভেবেছিলাম এটি অসম্ভব
রাফেল ভিদুরে

4
এটি সত্যিই দরকারী। এটি অত্যন্ত দুঃখজনক যে :: এনজি-গভীরকে প্রতিস্থাপন না করে এতদিন অবধি অবহেলা করা হয়েছিল (: হোস্ট :: এনজি-গভীর প্রত্যাশার মতো কাজ করে, তবে আমি অবহেলা জিনিস ব্যবহার করতে চাই না)।
আলেক্সি

6

যেমন কেউ আগে বলেছে, আপনি যদি কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করেন তবে ::ng-deepএকবারে একবার ব্যবহার করা এড়ানো কার্যত অসম্ভব । ::ng-deepব্রাউজারগুলির দ্বারা আর সমর্থিত হয়ে উঠলে আপনি আপনার পূর্ববর্তী প্রকল্পগুলি সম্পর্কে কী করতে চলেছেন ?

এই মুহুর্তের জন্য প্রস্তুত হতে আমি নীচের পরামর্শ দেব:

  1. ব্যবহারের ViewEncapsulation.None বিজ্ঞতার সঙ্গে। যা কেবল সেই উপাদানগুলির জন্য অনুবাদ করে যা গভীর উপাদানগুলিতে অ্যাক্সেস করতে হবে।
@Component({
      selector: 'app-example',
      templateUrl: './example.component.html',
      styleUrls: ['./example.component.scss'],
      encapsulation: ViewEncapsulation.None
    })
  1. এখন, সংঘর্ষ এবং CSS অদ্ভুততা এড়াতে আপনার (নিয়ম হিসাবে) সর্বদা আপনার উপাদানগুলির টেম্পলেটটি কোনও শ্রেণীর সাথে আবৃত করা উচিত । সুতরাং, উদাহরণ.component.html এর মতো হওয়া উচিত:
<section class="app-example-container">
<!-- a third party component -->
<mat-tab-group>
<mat-tab label="First"></mat-tab>
<mat-tab label="Second"></mat-tab>
</mat-tab-group>
</section>
  1. আবার নিয়ম অনুসারে, প্রতিটি একক এসএসএসএস ফাইলের প্রথম লাইনটি উপাদান ধারককে লক্ষ্য করবে। যেহেতু কোনও এনক্যাপসুলেশন নেই আপনি তৃতীয় পক্ষের উপাদানগুলি তাদের ক্লাসগুলি লক্ষ্য করে পরিবর্তন করতে পারবেন। এটি বলেছে, example.componal.scss এর মতো হওয়া উচিত:
.app-example-container {
/* All the CSS code goes here */
.mat-tab-group .mat-tab-label {color: red;}
}

2

এটি :: এনজি-গভীরের জন্য সাধারণ প্রতিস্থাপন নয়, তবে প্রশ্ন লেখকের দ্বারা বর্ণিত ব্যবহারের ক্ষেত্রে:

বিশেষ ক্ষেত্রে যেখানে আপনি রাউটার-আউটলেট দ্বারা সন্নিবেশ করা উপাদানটি স্টাইল করতে চান সেখানে সিএসএসে সংলগ্ন প্রতিবেশী নির্বাচনকারীকে ব্যবহার করে একটি মার্জিত সমাধান রয়েছে:

router-outlet+* {
  /* styling here... */
}

এটি এমন সমস্ত উপাদানগুলিতে প্রযোজ্য যা রাউটার-আউটলেটের প্রত্যক্ষ প্রতিবেশী।

আরও পড়ুন:
https://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_combinator
https://angular.io/guide/router#router-outlet


4
আমি এই নির্বাচক ব্যবহার করার পরামর্শ দেব না। দেখে মনে হচ্ছে আপনি সংঘর্ষের একটি আক্ষরিক দুঃস্বপ্ন খুলছেন বিশেষত যখন আপনার অ্যাপ্লিকেশনটি বৃদ্ধি পায় grows তার উপরে, * নির্বাচক আক্ষরিক অর্থে সিএসএস অস্তিত্বের একক ধীরতম নির্বাচক।
দুদেওয়াদ

@ দুদেওয়াদ যদিও * নির্বাচকটি সবচেয়ে ধীর নির্বাচক, এটি কেবল আক্ষরিক অর্থে পরবর্তী ভাইবোন (+) এ প্রয়োগ করা হচ্ছে, পুরো শৃঙ্খলা / বৃক্ষ নয়, সুতরাং এটি কেবলমাত্র নামমাত্র পার্থক্য করা উচিত।
এরিক ফিলিপস

@ এরিক ফিলিপস সিএসএস নির্বাচনকারীদের ডান থেকে বামে পার্স করা হয়েছে, সুতরাং এটি আসলে সবচেয়ে খারাপ পরিস্থিতি worst
dudewad

@ দেউদওয়াদ আমার মনে হয় আমরা কিছু মিস করছি। *সবচেয়ে খারাপ পরিস্থিতি খুব কাছাকাছি অনুসরন করে element *তবে element + *এটি প্রথম দুটির কাছাকাছি নয়।
এরিক ফিলিপস

আমি জানি না ... আমি এটি পরীক্ষা করে দেখিনি, সিএসএস পার্সাররা কীভাবে তাদের কাজটি করে তা সম্পর্কে আমি যা জানি তা কেবল এটিই ভিত্তিক।
দোয়াদওয়াদ

1

ডিফল্ট এনক্যাপসুলেশন পরিবর্তন এড়াতে, আমি একটি সহায়ক লিখেছি যা উপাদানটির জন্য গ্লোবাল শৈলী যুক্ত করে:

ডিপস্টাইল.টিএস

import { ViewContainerRef } from '@angular/core';

export function deepStyle(vcr: ViewContainerRef, csss: string[]){
    let id = 'deep-' + vcr.element.nativeElement.tagName;
    let styleElement = document.getElementById('pierce-' + vcr.element.nativeElement.name);
    if(!styleElement){
        styleElement = document.createElement('style');
        styleElement.id = id;
        styleElement.innerHTML = csss.map(css => vcr.element.nativeElement.tagName + ' ' + css).join('\n');
        document.head.append(styleElement);
    }
}

আমার-উপাদান.ts

import { Component, ViewContainerRef } from '@angular/core';
import { deepStyle } from '../deepStyle';

@Component({
  selector: 'my-component',
  templateUrl: './my-component.html',
  styleUrls: ['./my-component.css']
})
export class MyComponent {
   constructor(vcr: ViewContainerRef) {
    deepStyle(vcr, [`
       img {
         height: 180px;
       }
    `]);
  }
}

ফলাফল:

<head>
...
<style id="deep-MY-COMPONENT">
    MY-COMPONENT img {
      height: 180px;
    }
</style>
...
</head>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.