【问题标题】:Angular 2 compile dynamic template with dataAngular 2 用数据编译动态模板
【发布时间】:2017-02-26 06:01:46
【问题描述】:

我正在为 jquery 网格控件开发类似桥的界面。网格使用以下语法呈现并按预期工作。

<t-grid>
  <t-column>...</t-column>
  <t-column>...</t-column>
</t-grid>

在提供对 t-column 标记内呈现模板的支持时,我能够获取数据和 jquery 元素。

jQuery 元素

<div class="angulartmplbda8aedb-6b16-456d-8c17-3240a674b0c7 angular-template">
   <div _ngcontent-ila-1="">
     <input _ngcontent-ila-1="" type="button" value="Template"></div>
 </div>

现在,按钮显示为template 文本。如何动态改变来自gridData的输入元素值?

 export class TemplateElement {
private context: any;
__parent: tComponents<any, any>; 
constructor(protected el: ElementRef) {
}

ngOnInit() {
    template.render = (self, selector, data, index, prop) => {
        let templateObject = self.angularTemplate;
        if (!templateObject || !templateObject[selector]) {
            templateObject = templateObject || {};
            templateObject[selector] = { key: t.getGuid('angulartmpl'), itemData: [], views: [] };
            self.angularTemplate = templateObject;
        }
        let scope = templateObject[selector];
        if (!t.isNullOrUndefined(index)) {
            if (!scope.itemData)
                scope.itemData = [];
            scope.itemData[index] = data;
        } else {
            scope.itemData = [data];
        }
        let actElement = $(this.el.nativeElement).html();
        let tempElement = "<div class='" + templateObject[selector].key + " t-angular-template'>" + actElement + '</div>';
        return tempElement;
    }
}
ngAfterViewInit() {
    this.compileTempalte();
}

compileTempalte() {
    let element = this.__parent.widget.element;
    let templates = $(element).find('.t-angular-template');
    let templateObject = this.__parent.widget.angularTemplate;
    for (let template in templateObject) {
        let tmplElement = templates.filter('.' + templateObject[template].key);
        if (tmplElement.length) {
            for (let i = 0; i < tmplElement.length; i++) {
               //modified code 
               childView = this.viewContainerRef.createEmbeddedView(this.templateRef, { '$implicit': templateObject[template].itemData[i] });                    
                this.childViews[i] = childView;
                $(tmplElement[i]).append(childView.rootNodes);
            }
        } else {
            delete templateObject[template];
        }
    }
}

clearTempalte() {
    let templateObject = this.__parent.widget.angularTemplate;
    if (templateObject && Object.keys(templateObject).length) {
        for (let tmpl in templateObject) {
            delete templateObject[tmpl];
        }
    }
}
ngOnDestroy(){
    this.clearTempalte()
}

}

【问题讨论】:

标签: jquery angular typescript template-engine custom-component


【解决方案1】:

如果要将变量分配给属性,则需要使用括号语法:

     <input _ngcontent-ila-1="" type="button" [value]="Template"></div>

[] 表示变量Template 将分配给input 元素的value 属性。

如此处所述: https://angular.io/docs/ts/latest/guide/template-syntax.html#!#binding-syntax

【讨论】:

  • 我不是在寻找语法。我在指令 中有数据和 jquery 元素。我正在寻找如何在 ngAfterViewInit 生命周期钩子中动态编译元素和数据。
  • 我不明白您要做什么,请提供更多代码和信息。
  • 使用 TemplateElement 类更新查询。其中如何使用 compileTemplate() 方法中的数据编译模板。模板可以是任何将被放置在 gridcell 中的东西(Checkbox、Dropdown 等)。
【解决方案2】:

如前所述,您需要使用嵌入:

并且您需要在这部分添加 let-item="$implicit" :

<template t-template let-item="$implicit">
    <input t-button [value]="item.CustomerID" />
</template>

【讨论】:

  • 我正在寻找从 .... 标签动态编译innerHTML。我能够在 ngAfterViewInit 方法中获取 innerHTML 和 gridData。即
    {{data.value}}
    ,在这个模板中如何编译表达式?
  • 我做了一些分析,我可以处理 innerHTML 并使用已在查询中更新的 EmbeddedView 在网格单元格中呈现相同内容。 childView = this.viewContainerRef.createEmbeddedView(this.templateRef, { '$implicit': templateObject[template].itemData[i] }); this.childViews[i] = childView; $(tmplElement[i]).append(childView.rootNodes);但是动态数据编译不起作用。我做错什么了吗?
  • OK... 你的英语很难听懂。但是,我只是不确定“动态数据编译不起作用”是什么意思。什么动态数据编译?不幸的是,我不明白你的意思。
  • 感谢您的 cmets。我使用 ViewContainerRef 和 TemplateRef 解决了这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 2016-12-23
  • 2015-10-19
  • 1970-01-01
  • 2016-02-18
  • 2017-10-18
相关资源
最近更新 更多