কৌণিক 2: এর মোড়ক ট্যাগ ছাড়াই কোনও উপাদান সরবরাহ করুন


107

আমি এটি করার জন্য একটি উপায় খুঁজতে লড়াই করছি। কোনও প্যারেন্ট উপাদানগুলিতে টেমপ্লেটটি একটি tableএবং এর theadউপাদানটির বর্ণনা দেয় তবে প্রতিনিধিরা tbodyঅন্য উপাদানকে রেন্ডারিং করে যেমন:

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Time</th>
    </tr>
  </thead>
  <tbody *ngFor="let entry of getEntries()">
    <my-result [entry]="entry"></my-result>
  </tbody>
</table>

প্রতিটি মাইআরসাল্ট উপাদান তার নিজস্ব trট্যাগটি রেন্ডার করে , মূলত:

<tr>
  <td>{{ entry.name }}</td>
  <td>{{ entry.time }}</td>
</tr>

যেহেতু আমি এটি সরাসরি প্যারেন্ট উপাদানগুলিতে রাখছি না (মাইআরসাল্ট উপাদানটির প্রয়োজনীয়তা এড়ানো) এটি হ'ল মাইআরসাল্ট উপাদানটি এখানে দেখানো থেকে বেশি জটিল, তাই আমি এর আচরণটি একটি পৃথক উপাদান এবং ফাইলে রাখতে চাই।

ফলস্বরূপ DOM দেখতে খারাপ দেখাচ্ছে। আমি বিশ্বাস করি এটি কারণ এটি অবৈধ, কারণ এতে tbodyকেবল trউপাদান থাকতে পারে (এমডিএন দেখুন) তবে আমার উত্পন্ন (সরলীকৃত) ডিওএম হ'ল:

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Time</th>
    </tr>
  </thead>
  <tbody>
    <my-result>
      <tr>
        <td>Bob</td>
        <td>128</td>
      </tr>
    </my-result>
  </tbody>
  <tbody>
    <my-result>
      <tr>
        <td>Lisa</td>
        <td>333</td>
      </tr>
    </my-result>
  </tbody>
</table>

আমরা কোনও একই উপায়ে রেন্ডার করতে পারি, তবে মোড়ানো <my-result>ট্যাগ ছাড়াই , এবং এখনও কোনও উপাদানটি টেবিল সারি উপস্থাপনের জন্য একমাত্র দায়বদ্ধ হিসাবে ব্যবহার করার কি আছে?

আমি দিকে তাকিয়ে আছে ng-content, DynamicComponentLoader, ViewContainerRef, কিন্তু তারা যতটা দেখতে পাচ্ছি এই একটি সমাধান প্রদান মনে হচ্ছে না।


আপনি কি একটি কাজের উদাহরণ দেখাতে পারেন?
জাকারিয়া আমিনে

4
সঠিক উত্তর আছে, একটি plunker নমুনা সঙ্গে stackoverflow.com/questions/46671235/...
sancelot

4
প্রস্তাবিত উত্তরগুলির কোনওটিই কাজ করছে না, বা সম্পূর্ণ। সঠিক উত্তর একটি plunker নমুনা এখানে বর্ণনা করা হয়েছে stackoverflow.com/questions/46671235/...
sancelot

উত্তর:


101

আপনি বৈশিষ্ট্য নির্বাচনকারী ব্যবহার করতে পারেন

@Component({
  selector: '[myTd]'
  ...
})

এবং তারপরে এটি ব্যবহার করুন

<td myTd></td>

আপনার উপাদান নির্বাচনকারী কি এতে রয়েছে []? আপনি কি declarations: [...]কোনও মডিউলটির উপাদান যুক্ত করেছেন ? উপাদানটি যদি অন্য কোনও মডিউলটিতে নিবন্ধিত হয়, আপনি imports: [...]যে উপাদানটি ব্যবহার করতে চান সেই মডিউলটিতে আপনি কি এই অন্যান্য মডিউলটি যুক্ত করেছেন ?
গন্টার জ্যাচবাউর

4
কোন setAttributeআমার কোড নয়। তবে আমি এটি বের করে ফেলেছি, আমার টেমপ্লেটে আসল শীর্ষ স্তরের ট্যাগটি আমার ng-containerনতুন উপাদান ব্যবহারের পরিবর্তে আমার উপাদানটির ট্যাগ হিসাবে ব্যবহার করতে হবে<ul smMenu class="nav navbar-nav" [submenus]="root?.Submenus" [title]="root?.Title"></ul>
অ্যাভিয়াড পি।

4
আপনি এনজি-ধারকটিতে অ্যাট্রিবিউট উপাদান সেট করতে পারবেন না কারণ এটি ডিওএম থেকে সরানো হয়েছে। এজন্য আপনাকে এটি একটি আসল এইচটিএমএল ট্যাগে সেট করা দরকার।
রোবস্টে

4
@ অ্যাভিএডিপি অনেক অনেক ধন্যবাদ ... আমি জানতাম যে এখানে একটি ছোটখাটো পরিবর্তন দরকার যা আমি প্রয়োজন এবং এটির জন্য আমি আমার মন হারাচ্ছি। সুতরাং এর পরিবর্তে: <ul class="nav navbar-nav"> <li-navigation [navItems]="menuItems"></li-navigation> </ul>আমি এটি ব্যবহার করেছি (কোনও বৈশিষ্ট্য নির্বাচকের কাছে লি-নেভিগেশন পরিবর্তনের পরে)<ul class="nav navbar-nav" li-navigation [navItems]="menuItems"></ul>
মহেশ

4
এই উত্তরটি কার্যকর হয় না যদি আপনি কোনও উপাদান সংযোজন উদাহরণস্বরূপ <ম্যাট-টুলবার আমার-সরঞ্জামদণ্ড-সারি> বৃদ্ধি করার চেষ্টা করছেন তবে অভিযোগ করবে যে আপনার কেবলমাত্র একটি উপাদান নির্বাচক একাধিক নয়। আমি <my-toolbar- কম্পোনেন্ট> যেতে পারতাম তবে তারপরে এটি মাদুর-সরঞ্জামদণ্ডটি একটি ডিভের ভিতরে রেখে দিচ্ছি
রবার্ট কিং

25

আপনার "ভিউ কনটেনারআরফ" দরকার এবং আমার ফলাফলের উপাদানটির ভিতরে এটির মতো কিছু করুন:

এইচটিএমএল:

<ng-template #template>
    <tr>
       <td>Lisa</td>
       <td>333</td>
    </tr>
 </ng-template>

ts:

@ViewChild('template') template;


  constructor(
    private viewContainerRef: ViewContainerRef
  ) { }

  ngOnInit() {
    this.viewContainerRef.createEmbeddedView(this.template);
  }

6
একটি যাদুমন্ত্র মত কাজ করে! ধন্যবাদ. আমি পরিবর্তে নিম্নলিখিত @ViewChild('template', {static: true}) template;
কৌনিক

4
এটি কাজ করে। আমার একটি পরিস্থিতি ছিল আমি সিএসএস প্রদর্শন ব্যবহার করেছিলাম: গ্রিড এবং এটি এখনও আপনার ফলাফলের ভাই-বোন হিসাবে আমার ফলাফলের সমস্ত উপাদান উপাদান সহ পিতামাতার মধ্যে প্রথম উপাদান হিসাবে <my-result> ট্যাগ থাকতে পারে না can't । সমস্যাটি হ'ল একটি অতিরিক্ত ভূতের উপাদান এখনও গ্রিডগুলি 7 টি কলাম "গ্রিড-টেম্পলেট-কলাম: পুনরাবৃত্তি (7, 1 এফআর) ভেঙেছে;" এবং এটি 8 টি উপাদান রেন্ডার করছিল। আমার ফলাফলের জন্য 1 ভূত স্থান ধারক এবং 7 টি কলাম শিরোলেখ। এর জন্য কাজটি ছিল কেবল আপনার ট্যাগে <my-ফলাফল শৈলী = "প্রদর্শন: কিছুই নয়"> রেখে এটিকে আড়াল করা। সিএসএস গ্রিড সিস্টেম তার পরে কবজির মতো কাজ করেছিল।
র্যান্ডালটো

এই সমাধানটি আরও জটিল ক্ষেত্রেও কাজ করে, যেখানে my-resultনতুন my-resultভাইবোন তৈরি করতে সক্ষম হওয়া প্রয়োজন । সুতরাং, কল্পনা করুন যে আপনার my-resultপ্রতিটি স্তরের যেখানে "শিশু" সারি থাকতে পারে তার একটি শ্রেণিবিন্যাস রয়েছে । সেক্ষেত্রে, প্রথম নির্বাচক যেমন চলে তেমন একটি অ্যাট্রিবিউট সিলেক্টর ব্যবহার করা কাজ করবে না tbody, তবে দ্বিতীয়টি অভ্যন্তরীণ tbodyবা একটিতে যেতে পারবে না tr
ড্যানিয়েল

4
আমি যখন এটি ব্যবহার করি তখন কীভাবে আমি এক্সপ্রেশনচেনজডএফটারআইটিহাসবাইনচেকডএরর পাওয়া এড়াতে পারি?
gyozo kudor

@gyozokudor সম্ভবত একটি সেটটাইমআউট ব্যবহার করছে
ডিয়েগো ফার্নান্দো মারিলো ভ্যালেনসি

13

আপনি নতুন সিএসএস ব্যবহার করার চেষ্টা করতে পারেন display: contents

এখানে আমার সরঞ্জামদণ্ডের এসএসএস:

:host {
  display: contents;
}

:host-context(.is-mobile) .toolbar {
  position: fixed;
  /* Make sure the toolbar will stay on top of the content as it scrolls past. */
  z-index: 2;
}

h1.app-name {
  margin-left: 8px;
}

এবং এইচটিএমএল:

<mat-toolbar color="primary" class="toolbar">
  <button mat-icon-button (click)="toggle.emit()">
    <mat-icon>menu</mat-icon>
  </button>
  <img src="/assets/icons/favicon.png">
  <h1 class="app-name">@robertking Dashboard</h1>
</mat-toolbar>

এবং ব্যবহারে:

<navigation-toolbar (toggle)="snav.toggle()"></navigation-toolbar>

12

এই উপাদানটি আপনার উপাদানটিতে ব্যবহার করুন

@Directive({
   selector: '[remove-wrapper]'
})
export class RemoveWrapperDirective {
   constructor(private el: ElementRef) {
       const parentElement = el.nativeElement.parentElement;
       const element = el.nativeElement;
       parentElement.removeChild(element);
       parentElement.parentNode.insertBefore(element, parentElement.nextSibling);
       parentElement.parentNode.removeChild(parentElement);
   }
}

ব্যবহারের উদাহরণ:

<div class="card" remove-wrapper>
   This is my card component
</div>

এবং প্যারেন্ট এইচটিএমএলে আপনি যথারীতি কার্ড উপাদান কল করেন, উদাহরণস্বরূপ:

<div class="cards-container">
   <card></card>
</div>

আউটপুটটি হবে:

<div class="cards-container">
   <div class="card" remove-wrapper>
      This is my card component
   </div>
</div>

6
এটি একটি ত্রুটি ছুঁড়েছে কারণ 'প্যারেন্টেলমেন্ট.প্যারেন্টনোড' নাল
এমিরহোসেসিনি

4
ধারণাটি ভাল তবে এটি সঠিকভাবে কাজ করছে না :-(
জ্যামপোটিন

10

বৈশিষ্ট্য নির্বাচনকারীরা এই সমস্যাটি সমাধানের সেরা উপায়।

সুতরাং আপনার ক্ষেত্রে:

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Time</th>
    </tr>
  </thead>
  <tbody my-results>
  </tbody>
</table>

আমার ফলাফল ts

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

@Component({
  selector: 'my-results, [my-results]',
  templateUrl: './my-results.component.html',
  styleUrls: ['./my-results.component.css']
})
export class MyResultsComponent implements OnInit {

  entries: Array<any> = [
    { name: 'Entry One', time: '10:00'},
    { name: 'Entry Two', time: '10:05 '},
    { name: 'Entry Three', time: '10:10'},
  ];

  constructor() { }

  ngOnInit() {
  }

}

আমার ফলাফল এইচটিএমএল

  <tr my-result [entry]="entry" *ngFor="let entry of entries"><tr>

আমার ফলাফল ts

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

@Component({
  selector: '[my-result]',
  templateUrl: './my-result.component.html',
  styleUrls: ['./my-result.component.css']
})
export class MyResultComponent implements OnInit {

  @Input() entry: any;

  constructor() { }

  ngOnInit() {
  }

}

আমার ফলাফল এইচটিএমএল

  <td>{{ entry.name }}</td>
  <td>{{ entry.time }}</td>

কার্যকারী স্ট্যাকব্লিটজ দেখুন: https://stackblitz.com/edit/angular-xbbegx


নির্বাচক: 'আমার-ফলাফল, [আমার ফলাফল]', তারপরে আমি আমার ফলাফলগুলিকে এইচটিএমএলে ট্যাগের বৈশিষ্ট্য হিসাবে ব্যবহার করতে পারি। এটা সঠিক উত্তর. এটি কৌনিক 8.2 এ কাজ করে।
ডন দিলঙ্গা

5

আজকাল আর একটি বিকল্প প্যাকেজContribNgHostModule থেকে উপলব্ধ করা হয় ।@angular-contrib/common

মডিউলটি আমদানির পরে host: { ngNoHost: '' }আপনি আপনার @Componentডেকরেটারে যুক্ত করতে পারবেন এবং কোনও মোড়কের উপাদান রেন্ডার করা হবে না।

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