【问题标题】:Angular2: Cloning component / HTML element and it's functionalityAngular2:克隆组件/ HTML 元素及其功能
【发布时间】:2016-12-29 03:35:01
【问题描述】:

所以,这个问题很简单……

我有一个表格和一些角度逻辑(计算样式等)...特别是我在 THs 上有这个

[class.hidden] = "column.group !== 'key-data' && currentTableView !== column.group"

对于我的表格粘性标题功能,我需要克隆表格并将其定位固定.. 使用指令执行类似这样的操作(简化)

let newTable = element.cloneNode(true);
body.appendChild(newTable);

显然角度逻辑不适用于 newTable,但我希望它是...

我该怎么做?

【问题讨论】:

  • 为什么不直接用相同的数据创建一个新实例呢?我认为没有办法以这种方式克隆它。
  • 新实例 + 存储/获取属性(通过服务或在最坏的情况下从 localStorage,..)
  • 不是用来获取数据的……是用来切换可见列和隐藏列的。 ngClass 有一些角度逻辑放在 TH 上...我想在克隆的 TH 上保留相同的逻辑

标签: javascript angular angular2-directives


【解决方案1】:

所以我做了一些研究,这就是我想出的。

您可以做到,而且使用模板和[ngTemplateOutlet] 实际上并不难。它是这样工作的:

@Component({
  selector: 'my-app',
  template: `
    <ng-template #temp>
        <h1 [ngStyle]="{background: 'green'}">Test</h1>
        <p *ngIf="bla">Im not visible</p>   
    </ng-template>
    <ng-container *ngTemplateOutlet="temp"></ng-container>
    <ng-container *ngTemplateOutlet="temp"></ng-container>
    `
})

export class AppComponent {
    bla: boolean = false;
    @ContentChild('temp') testEl: any;
} 

因此,您创建一个参考模板,在其中添加所有逻辑,然后您只需使用[ngTemplateOutlet] 创建尽可能多的模板副本。保留所有内部绑定和角度功能。

这是一个正常工作的插件:

http://plnkr.co/edit/jPt5eKUfLUe9FxnLH8bL?p=preview

如您所见,我已经使用 *ngIf[ngStyle] 对其进行了测试,它们按预期工作,我看不出任何其他类型的指令不起作用的任何原因。

您甚至可以使用*ngFor,但您需要提供[ngOutletContext]。 我已经在我正在开发的库中完成了这项工作,您可以在此处查看示例:

https://github.com/flauc/ng2-simple-components/blob/master/src/select/select.component.ts

【讨论】:

  • 看起来不错...想奖励您赏金,但如果这就是我要找的东西,还没有检查/测试过...看起来很接近
  • 我已经成功使用过几次了,希望对你也有用。
  • ERROR TypeError: templateRef.createEmbeddedView is not a function,
  • 感谢@VictorBredihin,实现从编写时发生了变化。我已经更新了我的答案,使其与当前版本的 angular 保持一致。
猜你喜欢
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多