Home  >  Article  >  Web Front-end  >  Passing template to component in Angular

Passing template to component in Angular

亚连
亚连Original
2018-06-05 14:46:111709browse

This article mainly introduces two methods for Angular to pass templates to components. The first method is d553bd28b5bbbbd4b6fb4990edbabbf0 the second method is the NgTemplateOutlet directive and various usage methods. Friends who need it can refer to it

Recently I am writing a date picker component. In order to meet various needs that may arise in the future, I need to be able to highly customize the style of the component. In order to achieve this goal, you need to be able to control the content to be displayed in each date grid outside the date picker component, such as marking holidays. At this time, part of the template of the component needs to be provided by the caller.

In React, this requirement is quite simple. Just implement a function like date => Element , but Angular templates are pure templates and need to use some special The concept can realize this function.

The first wayd553bd28b5bbbbd4b6fb4990edbabbf0

##d553bd28b5bbbbd4b6fb4990edbabbf0 As of the time of writing this article, this tag has not yet been The official documentation doesn't even have placeholders. But this does not hinder our use. Enthusiastic foreign netizens have summarized the characteristics and functions of d553bd28b5bbbbd4b6fb4990edbabbf0 at the current stage.

Basic usage

<!-- Wrapper.Component.html -->
<p>
  hello
  <ng-content></ng-content>
</p>

Suppose we have the above component, and then call it like this:

<wrapper>
  <span> World </span>
</wrapper>

Then the final rendering result will be like this:

<p>
  hello
  <span> World </span>
</p>

It seems that a very simple replacement has occurred, but if multiple

d553bd28b5bbbbd4b6fb4990edbabbf0 appear in the Wrapper, will multiple 45a2772a6b6107b401db3c9b82c049c2 World 54bdf357c58b8a65c66d7c19c8e4d114 appear? ? The answer is no. d553bd28b5bbbbd4b6fb4990edbabbf0 The essence is just to move elements, and will not automatically create the incoming template, so even if you use ngFor to wrap d553bd28b5bbbbd4b6fb4990edbabbf0 There will be many 45a2772a6b6107b401db3c9b82c049c2 World 54bdf357c58b8a65c66d7c19c8e4d114. If custom components are passed in, these components will only be instantiated once.

Advanced Usage

Of course, if the function of

d553bd28b5bbbbd4b6fb4990edbabbf0 is just like this, it will be too useless. When using d553bd28b5bbbbd4b6fb4990edbabbf0 You can specify a selector, which can capture matching direct child elements. For example:

<!-- Wrapper.Component.html -->
<p>
  hello
  <ng-content></ng-content>
  <hr/>
  <ng-content select="span"></ng-content>
</p>

Then use it like this:

<wrapper>
  <span> World </span>
  2333
</wrapper>

The final rendering result will be like this:

<p>
  hello
  2333
  <hr/>
  <span> World </span>
</p>

In addition to setting the

ng-content tag In addition to the select attribute, you can also use the ngProjectAs attribute on the child element. This attribute allows this element to be captured by the ng-content specified in the parent element. For example:

<wrapper>
  <p ngProjectAs="span"> World </p>
  2333
</wrapper>

The template passed in this time becomes a p, but because ngProjectAs is set, "World" will appear below the dividing line.

The second method NgTemplateOutlet directive

Using

ng-content can indeed have the effect of passing in a template. But there is a very fatal problem, that is, data cannot be passed to the incoming template. In order to pass data into the incoming template, you need to use the NgTemplateOutlet directive.

Basic usage

This command can be used to instantiate a TemplateRef object at a specified location in the template. At the same time, a data can also be passed in during the instantiation process. object. TemplateRef can be created through the ng-template tag. For example:

@Component({
 selector: &#39;ng-template-outlet-example&#39;,
 template: `
  <ng-container *ngTemplateOutlet="name; context: myContext"></ng-container>

  <ng-template #name let-name="data"><span>Hello {{name}}!</span></ng-template>
`
})
class NgTemplateOutletExample {
 myContext = {data: &#39;World&#39;};
}

ng-container is a virtual element. On this element, we use an NgTemplateOutlet directive to specify To instantiate the following ng-template named name. At the same time, the myContext object is passed in as the instantiated data context, so "Hello World!" will eventually be displayed. It is worth noting the way to obtain the transmitted data context in ng-template: let-variableName='key'.

Advanced use

The next step is to implement the requirements mentioned at the beginning of this article, passing in the template outside the component. Let’s take the above example as an example. Because the template needs to be passed in as sub-content from the outside world, we need to capture the template manually. If necessary here, we need to use ContentChild:

@Component({
 selector: &#39;wrapper&#39;,
 template: `
  <ng-container *ngTemplateOutlet="name; context: myContext"></ng-container>
`
})
class NgTemplateOutletExample {
 @ContentChild(TemplateRef) name: TemplateRef<any>;
 myContext = {data: &#39;World&#39;};
}

Such a simple change can allow us to The component has accepted templates from the outside world, let’s give it a try:

<wrapper>
  <ng-template let-value="data">
    <span>Hello {{value}}!</span>
  </ng-template>
</wrapper>

The above is what I compiled for everyone. I hope it will be helpful to everyone in the future.

Related articles:

How to batch edit dynamically bound radio lists in vue.js

When using React components What are the commands to transfer Vue components?

How to copy content to the clipboard in JavaScript

The above is the detailed content of Passing template to component in Angular. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn