【问题标题】:kendo component encapsulation template/component usekendo组件封装模板/组件使用
【发布时间】:2017-01-03 21:59:21
【问题描述】:

是否可以通过 ng-content 或 TemplateRef 或类似方法来嵌入自定义列定义?我一直在通过站点 (http://www.telerik.com/kendo-angular-ui/components/grid/) 和 Angular2 child component as data 提供的 Kendo UI Grid plunker 进行测试,但无济于事。我也尝试过 ng-content select 但也没有。非常感谢任何帮助,谢谢!

@Component({
  selector: 'test-component',
  template: 
  `
    <kendo-grid [data]="Data">
    <kendo-grid-column></kendo-grid-column>
      // ??? // <ng-content kendo-grid-column></ng-content> // [object Object]
      // ??? // <kendo-grid-column ng-content></kendo-grid-column> // [object Object]
    </kendo-grid>
  `
})
export class TestComponent {
  @Input() Data: any;
}

@Component({
    selector: 'my-app',
    template: `
        <test-component [Data]="gridData">
          <kendo-grid-column field="ProductID" title="Product ID" width="120"></kendo-grid-column>
          <kendo-grid-column field="ProductName" title="Product Name"></kendo-grid-column>
          <kendo-grid-column field="UnitPrice" title="Unit Price" width="230"></kendo-grid-column>
          <kendo-grid-column field="Discontinued" width="120">
              <template kendoCellTemplate let-dataItem>
                  <input type="checkbox" [checked]="dataItem.Discontinued" disabled/>
              </template>
          </kendo-grid-column>
        </test-component>
    `
})
export class AppComponent { ... }

【问题讨论】:

    标签: angular angular2-template kendo-ui-angular2 angular2-ngcontent


    【解决方案1】:

    @rusev 在之前的评论中回答...这对我有用,谢谢!

    GridComponent 正在使用ContentChildren 来选择定义的列, 这不适用于嵌入。一种可能的解决方法 - plnkr.co/edit/w6EgmZL5z8J6CvpjMl2h?p=preview

    这是可以在 plunkr 中看到的答案

    import { Component, Input, ContentChildren, ViewChild, ChangeDetectorRef } from '@angular/core';
    import { ColumnComponent, GridComponent } from '@progress/kendo-angular-grid';
    
    const resolvedPromise = Promise.resolve(null); //fancy setTimeout
    
    @Component({
      selector: 'test-component',
      template: 
      `
        <kendo-grid [data]="Data">
        </kendo-grid>
      `
    })
    export class TestComponent {
      @Input() Data: any[];
    
      @ContentChildren(ColumnComponent) columns;
      @ViewChild(GridComponent) grid;
    
      constructor(private cdr: ChangeDetectorRef ) {}
      ngAfterContentInit() {
        resolvedPromise.then(() => { 
          this.grid.columns.reset(this.columns.toArray());
        });
      }
    }
    
    @Component({
        selector: 'my-app',
        template: `
            <test-component [Data]="gridData">
                <kendo-grid-column field="ProductID" title="Product ID" width="120"></kendo-grid-column>
            </test-component>
        `
    })
    export class AppComponent { ... }
    

    【讨论】:

    • plunker 上的示例似乎不再适用。在我的本地实现中,我收到以下错误:_v.context.$implicit.resolveStatus 为空。而且似乎重置没有考虑到一些更复杂的列实现,例如。剑道网格单元模板。任何更多细节将不胜感激。
    【解决方案2】:

    要选择带有ng-contentkendo-grid-column 元素,请使用:

    <ng-content select="kendo-grid-column"></ng-content>
    

    this plunkr

    【讨论】:

    • 我想我曾经尝试过这个或类似的东西。它似乎不起作用。结果是没有找到kendo-grid-column 组件时网格的默认行为。如果你把它拿出来,结果是一样的。如果您复制或删除某些列,它似乎不会影响结果。我认为它会像指令或组件一样寻找kendo-grid-column,因此我得到了[object Object]
    • GridComponent 使用ContentChildren 选择定义的列,这不适用于嵌入。一种可能的解决方法 - plnkr.co/edit/w6EgmZL5z8J6CvpjMl2h?p=preview
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2016-07-30
    • 1970-01-01
    • 2016-07-04
    • 2017-09-03
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多