标签: angular2-ngcontent

角2引用@ContentChild的动态实例

我正在使用Angular 2.0.1。

我有一个可以通过其他任何组件使用的组件<ng-content>-效果很好。

我遇到的问题是当我想引用注入的组件时。

如果我知道那<ng-content>将永远只是一个组件,我可以说: @ContentChild(MyComponent) dynamicTarget: IMyComponent;但是因为它可以是任何组件(我要做出的唯一假设是任何注入的组件都实现了特定的接口),所以变得棘手。

我也尝试过<ng-content #dynamicTarget'>,然后通过说来引用它, @ContentChild('dynamicTarget') dynamicTarget: IMyComponent;但这返回未定义。

有谁知道我该如何告诉Angular 2这个东西是组件的实例,以便我可以尝试在其上调用函数?

为了进一步阐明用例,我有一个多步骤向导,可以将任何组件作为内容,并且我想validate在内容上调用该函数(同样,我会假设在上述实例中存在该函数)

typescript angular2-ngcontent angular

6
推荐指数
1
解决办法
1817
查看次数

如何在嵌套的<ng-content>中使用ContentChild/Children

我成功地<ng-content></ng-content>用来在孙子中显示一个组件,如下所示:带有客户组件的父对子组件树,但现在我想@ContentChild在那个孙子中使用来访问传入的内容,但我似乎无法得到任何工作.

这是我尝试使用选择器和@ContentChildstackBlitz:https://stackblitz.com/edit/angular-dpu4pm .无论我做什么,@ContentChild总是在TheChild组件中未定义,但在TheParent组件中工作.

@Component({
  selector: 'spinner',
  template: `
    spinner
  `,
})

@Component({
  selector: 'my-app',
  template: `
    works <the-parent><spinner #spin></spinner></the-parent>
  `,
})

@Component({
  selector: 'the-parent',
  template: 'this is parent <the-child><ng-content #content></ng-content></the-child>'
})
export class TheParent  implements AfterViewInit{

   @ContentChild('spin') spin;

  ngAfterViewInit() {
    alert('parents spin is '+typeof this.spin);  //object
  }
}

@Component({
  selector: 'the-child',
  template: 'this is child <ng-content></ng-content>'
})
export class TheChild  implements AfterViewInit{

  @ContentChild('spin') spin;
   @ContentChild('content') content;

  ngAfterViewInit() { …
Run Code Online (Sandbox Code Playgroud)

angular2-ngcontent angular

6
推荐指数
0
解决办法
2607
查看次数

ngIf = false和ngContent仍会加载模板绑定

定义一个简单的组件,如下所示:

@Component({
  selector: 'loader',
  template: `<div *ngIf='false'>
        <ng-content></ng-content>
        </div>`,
})
export class Loader {}
Run Code Online (Sandbox Code Playgroud)

像这样使用时:

  <loader>
      {{model.something}}
  </loader>
Run Code Online (Sandbox Code Playgroud)

如果在父级中未定义model,我仍然会收到模板绑定错误,因为即使使用,它也会尝试解析绑定ngIf=false。为什么会这样呢?

javascript angular2-ngcontent angular

5
推荐指数
1
解决办法
408
查看次数

我可以“观察”组件的动态子代吗?

我有一个应用程序,我在其中使用多个表单组件组合表单。现在我想创建某种外键字段,它列出了已经存在的对象并显示了一个“添加”按钮。此按钮在模式对话框中显示另一个表单组件。该“子”表单仅使用<ng-content>. 这一切都很完美

我来说明一下情况。这是模板<form-component>

<form class="form">
    <form-field>
        <another-form-component (save)="handleSave()"></another-form-component>
    </form-field>
</form>
Run Code Online (Sandbox Code Playgroud)

的模板<form-field>

<modal-dialog-component [(visible)]="showForm">
    <!--
        Here the <another-form-component> which was passed
        to <form-field> is added:
    -->
    <ng-content></ng-content>
</modal-dialog-component>
<div class="form-field">
    <select> <!-- existing options --> </select>
    <button (click)="openForm($event);">Create new</button>
</div>
Run Code Online (Sandbox Code Playgroud)

如您所见,<another-form-component>有一个@Output()for itsave事件。这是一个EventEmitter.

我的问题是:如何EventEmitter<form-field>组件订阅此内容?我想知道表单何时保存,以便我可以关闭<modal-dialog>.

请记住:表单是使用<ng-content>. 我可以@ViewChildren用来获取孩子<form-field>并使用某种addEventListener()方法吗?这样的东西真的存在吗?

希望你能帮我!

你好,约翰

javascript angular2-ngcontent angular

5
推荐指数
1
解决办法
1170
查看次数

来自ng-content的参考组件变量

我有以下标记:

<group-header [isOpen]="true">
    <div *ngIf="isOpen">{{'PRICE' | resource}}</div>
</group-header>
Run Code Online (Sandbox Code Playgroud)

group-header的模板如下所示:

<div (click)="toggleGroups($event);">
    <ng-content></ng-content>
</div>
Run Code Online (Sandbox Code Playgroud)

isOpen在我的group-header组件中定义如下:

@Input()
set isOpen(value: boolean) {
    this._isOpen = value;
}

get isOpen() {
    return this._isOpen;
}
Run Code Online (Sandbox Code Playgroud)

显然我无法引用isOpen我想要的方式(或根本不是),因为我的'PRICE'资源永远不会显示.

有没有办法根据我的组件上的字段有条件地显示我的ng-content呈现内容?

希望这一切都有意义......如果不是,请问

编辑:根据@ PierreDuc的评论添加了setter :-)

angularjs angular2-ngcontent angular

5
推荐指数
1
解决办法
795
查看次数

Angular2 @ContentChildren未填充在父&lt;ng-content&gt;内部

问题:

@ContentChildren似乎不适用于父<ng-content>容器。即使内容是该组件的子代。

Plunker:https ://plnkr.co/edit/J5itJmDfwKwtBsG6IveP ? p = preview

注意:我正在使用{descendants: true}

示例代码:

主要HTML:

<div>
  <child>
    <test></test>
    <test></test>
    <test></test>
  </child>
  <br><br>
  <parent>
    <test></test>
    <test></test>
    <test></test>
  </parent>
</div>
Run Code Online (Sandbox Code Playgroud)

子组件:

<h2>Child</h2>
<parent>
  <ng-content></ng-content>
</parent>
Run Code Online (Sandbox Code Playgroud)

父组件:

<h3>Parent</h3>
<ng-content></ng-content>
<div class='length'>Line count : {{length}}</div>
Run Code Online (Sandbox Code Playgroud)

问题test对于子组件,组件 的长度为0,对于父组件,组件的长度为3。


详细代码:

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


@Directive({selector: 'test'})
export class Test {}

@Component({
  selector: 'parent',
  template: `
    <h3>Parent</h3>
    <ng-content></ng-content>
    <div class='length'>Line count : {{length}}</div>
  `
})
export class ParentComponent  { …
Run Code Online (Sandbox Code Playgroud)

javascript angular2-components angular2-ngcontent angular

5
推荐指数
1
解决办法
2097
查看次数

将属性传递给 ng-content 内的组件(标记所在的组件中不可用的属性)

我正在尝试开发一个轮播。

期望的最终结果应该是开发人员只需将整个标记写入一个位置(假设在app.component.html),仅使用一个options属性,然后轮播将接管。

问题是,carousel.component我需要设置一些属性carousel-item.component(属性app.component应该与...无关,但所有标记都在app.component.html)。

我怎样才能实现这个目标?

app.component.html:

<carousel [options]="myOptions">
    <carousel-item *ngFor="let item of items">
        <img [src]="item.image" alt="" />
    </carousel-item>
</carousel>

<hr />

<carousel [options]="myOptions2">
    <carousel-item *ngFor="let item of items">
        <img [src]="item.image" alt="" />
    </carousel-item>
</carousel>
Run Code Online (Sandbox Code Playgroud)

carousel.component.html:

<div class="carousel-stage">
    <ng-content></ng-content>
</div>
Run Code Online (Sandbox Code Playgroud)

carousel-item.component.html:

<ng-content></ng-content>
Run Code Online (Sandbox Code Playgroud)

transclusion angular2-ngcontent angular

5
推荐指数
1
解决办法
3473
查看次数

Angular 4 ngComponentOutlet加载动态组件,但不呈现路径内容

我正在尝试加载不同的"父"组件,并通过ng-content在每个父组件中进行定位将路由内容注入到这些不同的父组件中.基本上,每个父组件根据设备宽度(小/移动,中/平板和大/桌面)处理导航和其他样板材料.

为我的应用程序中的每个路由生成的内容需要被转换(注入)到父组件中.每条路线的内容使用特定的注入点ng-content.

我可以使用替换父组件<ng-container *ngComponentOutlet="ResponsiveComponent;"></ng-container>.问题是我的路由生成内容没有被注入ng-content每个父组件的目标位置.

这是交换父组件的代码. AppPageComponent扩展ResponsiveComponent,根据媒体查询监视设备宽度.

@Component({
    selector: 'app-page',
    template: `
        <ng-container *ngComponentOutlet="ResponsivePageComponent;"></ng-container>     
    `,  
    styleUrls: [ './page.component.scss'],
    providers: []
})
export class AppPageComponent extends ResponsiveComponent implements OnInit, OnDestroy
{
    ResponsivePageComponent;

    constructor(
        injector: Injector,
        zone: NgZone)
    {
        super(zone);    
    }

    ngOnInit()
    {       
        this.IsSmallEnvironmentStream
            .subscribe
            (
                (isSmall: boolean) =>
                { 
                    if (isSmall)
                    { 
                        this.ResponsivePageComponent= AppPageSmallComponent;
                    }                   
                },
                (err) => { },
                () => {}
            );

        this.IsMediumEnvironmentStream
            .subscribe
            (
                (isMedium: boolean) =>
                { …
Run Code Online (Sandbox Code Playgroud)

angular2-ngcontent router-outlet angular ng-component-outlet

5
推荐指数
1
解决办法
3141
查看次数

角度为4/5的条件ng-content

嗨,我想要一些有条件的ng-content实现, 例如

<div>
   <ng-content select="[card-icon]"></ng-content>
</div>
<div  #body>
   <div *ngIf="description.children.length;else newDiv">
      <ng-content select="[card-body]"></ng-content>
   </div>
   <div #newDiv>
      <ng-content select="[card-body]"></ng-content>
   </div>
</div>
<div  style="align-self: end;" #description [ngClass]="{'hide':!(description.children.length)}">
<ng-content select="[card-description]" ></ng-content>
</div>
Run Code Online (Sandbox Code Playgroud)

但#newDiv中没有​​投射任何东西.TIA.

angular2-ngcontent angular

5
推荐指数
2
解决办法
5019
查看次数

Angular2+ 渲染组件时根本不需要任何包装标签

我的子组件如下所示:

...
@Component({
    selector: '[child-component]'
    templateUrl: './child.template.html'
})
...
Run Code Online (Sandbox Code Playgroud)

我的父模板如下:

<span child-component [someInput]="123"></span>
Run Code Online (Sandbox Code Playgroud)

现在我想渲染子组件的内容,而<span>周围没有容器。我不想在父组件的模板中出现任何容器,只需要子组件模板的内容。

我已经尝试过其他一些标签了。

  • <ng-content>(根本没有渲染任何东西)
  • <ng-template>(嵌入模板上的组件:)
  • <ng-container>(无法在“节点”上执行“appendChild”)

提前致谢!

dom angular2-directives angular2-template angular2-ngcontent angular

5
推荐指数
2
解决办法
7551
查看次数