Angular(2+)组件,提供对投影内容的绑定

时间:2018-09-19 01:33:30

标签: angular binding angular2-directives projection

给出一个没有属性的根组件,该根组件模板将给出一个错误:

<div>My name is {{foo}}.</div>

我想创建一个用于投射其内容的组件(FooProvider),但还提供了对'foo'的绑定,这样我就可以在根组件中进行写了:

<foo-provider>
    <div>My name is {{foo}}.</div>
</foo-provider>

换句话说:如何将绑定放入

更新

尝试将此作为结构性指令也不起作用。怎么了(角度5.2.11)

这是根组件:

<ng-container *foo-provider>
    <div>foo = {{foo}}</div>
</ng-container>

这是FooProviderDirective:

import {Directive, TemplateRef, ViewContainerRef} from '@angular/core';

interface FooContext {
  foo: string;
}

@Directive({
  selector: '[foo-provider]'
})
export class FooProviderDirective {
  constructor(
    private readonly viewRef: ViewContainerRef,
    private readonly templateRef: TemplateRef<FooContext>
  ) {
    const context: FooContext = { foo: 'baz' };
    this.viewRef.createEmbeddedView(this.templateRef, context);
  }
}

3 个答案:

答案 0 :(得分:3)

不能。内容投影与包装有关,并管理插入内容的位置,而不是为插入的内容提供值。这是因为内容投影允许插入任何内容,并且提供默认值没有意义,因为在插入的内容中可能提供的值是完全未知的。

如果要避免在根组件中定义foo,请在单独的<foo>组件中定义它,如下所示:

<foo-provider>
  <foo [fooValue]="'Fred'"></foo>
</foo-provider>

<foo>如下所示:

<div>my name is {{ fooValue }}</div>

<foo> .ts控制器可以提供不提供任何值的默认值。

此外,尽管此github帖子未解决相同的问题,但确实提供了使用默认内容(没有提供任何内容且可能对您来说很有趣)的技巧:

https://github.com/angular/angular/issues/12530

答案 1 :(得分:0)

foo-providers.component.ts

__call__

app.component.ts

__call__

输出

__call__

答案 2 :(得分:0)

我想有可能。

具有如下结构指令:

@Directive({
  selector: '[foo-provider]'
})
export class FooProviderDirective {
  constructor(
    private readonly viewRef: ViewContainerRef,
    private readonly templateRef: TemplateRef<any>
  ) {
    const context = { $implicit: 'baz' };
    this.viewRef.createEmbeddedView(this.templateRef, context);
  }
}

您应该能够编写如下内容:

<div *foo-provider="let foo">
  foo = {{ foo }}
</div>

Ng-run Example