【问题标题】:Custom structural directive syntax "as" not working自定义结构指令语法“as”不起作用
【发布时间】:2020-01-01 13:49:40
【问题描述】:

我创建了一个结构指令来在没有数据时显示加载器,但是我无法使“as”语法工作(即asyncData$ | async as data)。

我创建了一个StackBlitz 示例。

在这里,当您单击按钮时,它会将数据发送到BehaviorSubject

如果我使用ngIf,它可以工作,但不适用于我自己的指令。

<pre *loader="name | async as b">
  !{{ b | json }}!
</pre>

<hr>
ngIf

<pre *ngIf="name | async as b">
  !{{ b | json }}!
</pre>

<br>

<button (click)="handler()">Load data</button>


这个问题被认为是“离题”,但事实并非如此。

我创建了一个示例代码。它不起作用,同时显示了我解决问题的尝试。问题完全与代码本身有关。

【问题讨论】:

标签: angular typescript rxjs


【解决方案1】:

使用时需要传递context才能查看

this.vc.createEmbeddedView(this.templateRef);

为了做到这一点,你可以在指令中定义一个context 变量:

@Directive({
  selector: '[loader]'
})
export class LoaderDirective {
    constructor(
        private readonly templateRef: TemplateRef<any>,
        private readonly vc: ViewContainerRef,
        private readonly resolver: ComponentFactoryResolver
    ) {
    }

    context: any = {};

    /** True - контент, false - лоадер */
    @Input('loader')
    set show(c: boolean) {
        if (c) {
            this.vc.clear();
            this.context.$implicit = this.context.loader = c;
            this.vc.createEmbeddedView(this.templateRef, this.context);
        } else {
            this.vc.clear();
            const comp = this.vc.createComponent(this.factory);
        }
    }

    private get factory() {
        return this.resolver.resolveComponentFactory(LoaderComponent);
    }
}

注意context$implicitloader 属性是分开分配的。这意味着您可以将任何带有context 的属性传递给视图。

希望这会有所帮助。

【讨论】:

  • 这是工作的stackblitz project
  • 抱歉,我错过了this.context.$implicit = this.context.loader = c;。有了这部分,它就可以工作了。为什么需要创建输入镜像上下文属性?
  • 不用担心 :) 正如here 所说,它是结构指令的微语法。 $implicit 表示默认值。当您使用 context 传递任何内容时,您可以在模板中使用给定名称访问它们。
  • 但是,当我只是将输入传递给$implicit 时,它不起作用。只有当我将它传递给 loader 属性时。不知何故,它完全不同,将值设置为 $implicit 可能是错误的(因为它们似乎可以重叠)。
  • 我又检查了一遍。你说的对。它可能会导致重叠。我目前在我的项目中使用这个解决方案。所以我也最好再看看这个问题 :) 如果我发现了什么,我会在这里添加它作为评论。
猜你喜欢
  • 1970-01-01
  • 2019-07-23
  • 2018-06-01
  • 2019-01-22
  • 2015-11-02
  • 1970-01-01
  • 2019-08-15
  • 2016-12-29
  • 2017-02-07
相关资源
最近更新 更多