Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 素数表动态单元格编辑控件_Javascript_Angular_Primeng_Primeng Datatable - Fatal编程技术网

Javascript 素数表动态单元格编辑控件

Javascript 素数表动态单元格编辑控件,javascript,angular,primeng,primeng-datatable,Javascript,Angular,Primeng,Primeng Datatable,我一直在跟踪 这是你的电话号码 所有三列都是可编辑的。“属性名称”列始终呈现编辑中的文本框,而“属性值类型”列始终呈现下拉列表 但是对于属性值列,我希望根据以下两个条件呈现文本框或下拉列表: 文本框如果该行的“属性值类型”单元格值为字符串 下拉列表如果该行的“属性值类型”单元格值为布尔值 我在网格HTML中添加了条件编辑控件。当我将“Property value Type”单元格的值从字符串更改为布尔值(或其他方式)时,该行的“Property value”单元格应该呈现下拉列表,但它仍然显示

我一直在跟踪

这是你的电话号码

所有三列都是可编辑的。“属性名称”列始终呈现编辑中的文本框,而“属性值类型”列始终呈现下拉列表

但是对于属性值列,我希望根据以下两个条件呈现文本框或下拉列表:

  • 文本框如果该行的“属性值类型”单元格值为字符串
  • 下拉列表如果该行的“属性值类型”单元格值为布尔值
  • 我在网格HTML中添加了条件编辑控件。当我将“Property value Type”单元格的值从字符串更改为布尔值(或其他方式)时,该行的“Property value”单元格应该呈现下拉列表,但它仍然显示一个文本框(除非触发分页事件或排序事件)

    如何刷新特定单元格

    组件:

    export class AppComponent {
      name = 'Angular';
      tableColumns = [
        { field: 'propName', header: 'Property Name' },
        { field: 'propValue', header: 'Property Value' },
        { field: 'propValueType', header: 'Property Value Type' },
      ];
      booleanOptions = [{ label: 'true', value: 'true' }, { label: 'false', value: 'false' }];
      propValueTypeOptions = [{ label: 'String', value: 'String' }, { label: 'Boolean', value: 'Boolean' }];
      tableItems = [
        { propName: 'prop 1', propValue: 'value 1', propValueType: 'String' },
        { propName: 'prop 2', propValue: 'true', propValueType: 'Boolean' },
        { propName: 'prop 3', propValue: 'value 3', propValueType: 'String' },
        { propName: 'prop 4', propValue: 'true', propValueType: 'Boolean' },
        { propName: 'prop 5', propValue: 'value 5', propValueType: 'String' },
        { propName: 'prop 6', propValue: 'true', propValueType: 'Boolean' },
        { propName: 'prop 7', propValue: 'value 7', propValueType: 'String' },
        { propName: 'prop 8', propValue: 'true', propValueType: 'Boolean' },
        { propName: 'prop 9', propValue: 'value 9', propValueType: 'String' },
        { propName: 'prop 10', propValue: 'true', propValueType: 'Boolean' },
      ];
    
    
      refreshGrid() {
        const temp = [...this.tableItems];
        this.tableItems = temp;
        setTimeout(() => {
          this.tableItems = [...temp];
        }, 0);
      }
    
      showPropNameEditCellTextBox(col) {
        return (col.field === 'propName');
      }
    
      showPropValueTypeEditDdl(col) {
        return (col.field === 'propValueType');
      }
    
      showPropValueTxtIfString(rowData, col) {
        return (col.field === 'propValue' && rowData.propValueType === 'String');
      }
    
      showPropValueDdlIfBoolean(rowData, col) {
        return (col.field === 'propValue' && rowData.propValueType === 'Boolean');
      }
    }
    
    <div>
        <p-table [columns]="tableColumns" [value]="tableItems" [paginator]="true" [rows]="15" resizableColumns="true" responsive="true"
         [rowHover]="true" derableColumns="true">
            <ng-template pTemplate="header" let-columns>
                <tr>
                    <th *ngFor="let col of columns" [pSortableColumn]="col.field">
                        {{col.header}}
                        <p-sortIcon [field]="col.field"></p-sortIcon>
                    </th>
                </tr>
            </ng-template>
            <ng-template pTemplate="body" let-rowData let-columns="columns">
                <tr>
                    <td pEditableColumn *ngFor="let col of columns">
                        <p-cellEditor>
                            <ng-template pTemplate="output">
                                {{rowData[col.field]}}
                            </ng-template>
    
                <!-- Show text box for "Property Name" column -->
                            <ng-template pTemplate="input" *ngIf="showPropNameEditCellTextBox(col)">
                                <input pInputText [(ngModel)]="rowData[col.field]" type="text" maxlength="50" class="form-control" />
                </ng-template>
                <!-- Show text box for "Property Name" column /-->
    
                <!-- Show Text for "Property Value" column if Property Value Type column is "String" -->
                <ng-template pTemplate="input" *ngIf="showPropValueTxtIfString(rowData, col)">
                  <input pInputText [(ngModel)]="rowData[col.field]" type="text" maxlength="50" class="form-control" />
                </ng-template>
                <!-- Show Text for "Property Value" column if Property Value Type column is "String" /-->
    
                <!-- Show Dropdown for "Property Value" column if Property Value Type column is "Boolean" -->
                <ng-template pTemplate="input" *ngIf="showPropValueDdlIfBoolean(rowData, col)">
                  <select class="form-control" [(ngModel)]="rowData[col.field]">
                    <option *ngFor="let item of booleanOptions" class="form-control" [value]="item.value">{{item.label}}</option>
                  </select>            
                </ng-template>
                <!-- Show Dropdown for "Property Value" column if Property Value Type column is "Boolean" /-->
    
                <!-- Show dropdown for "Property Value Type" column -->
                <ng-template pTemplate="input" *ngIf="showPropValueTypeEditDdl(col)">
                  <select class="form-control" [(ngModel)]="rowData[col.field]" (change)="refreshGrid()">
                    <option *ngFor="let item of propValueTypeOptions" class="form-control" [value]="item.value">{{item.label}}</option>
                  </select>
                </ng-template>
                <!-- Show dropdown for "Property Value Type" column /-->
                        </p-cellEditor>
                    </td>
                </tr>
            </ng-template>
        </p-table>
    </div>
    
    HTML:

    export class AppComponent {
      name = 'Angular';
      tableColumns = [
        { field: 'propName', header: 'Property Name' },
        { field: 'propValue', header: 'Property Value' },
        { field: 'propValueType', header: 'Property Value Type' },
      ];
      booleanOptions = [{ label: 'true', value: 'true' }, { label: 'false', value: 'false' }];
      propValueTypeOptions = [{ label: 'String', value: 'String' }, { label: 'Boolean', value: 'Boolean' }];
      tableItems = [
        { propName: 'prop 1', propValue: 'value 1', propValueType: 'String' },
        { propName: 'prop 2', propValue: 'true', propValueType: 'Boolean' },
        { propName: 'prop 3', propValue: 'value 3', propValueType: 'String' },
        { propName: 'prop 4', propValue: 'true', propValueType: 'Boolean' },
        { propName: 'prop 5', propValue: 'value 5', propValueType: 'String' },
        { propName: 'prop 6', propValue: 'true', propValueType: 'Boolean' },
        { propName: 'prop 7', propValue: 'value 7', propValueType: 'String' },
        { propName: 'prop 8', propValue: 'true', propValueType: 'Boolean' },
        { propName: 'prop 9', propValue: 'value 9', propValueType: 'String' },
        { propName: 'prop 10', propValue: 'true', propValueType: 'Boolean' },
      ];
    
    
      refreshGrid() {
        const temp = [...this.tableItems];
        this.tableItems = temp;
        setTimeout(() => {
          this.tableItems = [...temp];
        }, 0);
      }
    
      showPropNameEditCellTextBox(col) {
        return (col.field === 'propName');
      }
    
      showPropValueTypeEditDdl(col) {
        return (col.field === 'propValueType');
      }
    
      showPropValueTxtIfString(rowData, col) {
        return (col.field === 'propValue' && rowData.propValueType === 'String');
      }
    
      showPropValueDdlIfBoolean(rowData, col) {
        return (col.field === 'propValue' && rowData.propValueType === 'Boolean');
      }
    }
    
    <div>
        <p-table [columns]="tableColumns" [value]="tableItems" [paginator]="true" [rows]="15" resizableColumns="true" responsive="true"
         [rowHover]="true" derableColumns="true">
            <ng-template pTemplate="header" let-columns>
                <tr>
                    <th *ngFor="let col of columns" [pSortableColumn]="col.field">
                        {{col.header}}
                        <p-sortIcon [field]="col.field"></p-sortIcon>
                    </th>
                </tr>
            </ng-template>
            <ng-template pTemplate="body" let-rowData let-columns="columns">
                <tr>
                    <td pEditableColumn *ngFor="let col of columns">
                        <p-cellEditor>
                            <ng-template pTemplate="output">
                                {{rowData[col.field]}}
                            </ng-template>
    
                <!-- Show text box for "Property Name" column -->
                            <ng-template pTemplate="input" *ngIf="showPropNameEditCellTextBox(col)">
                                <input pInputText [(ngModel)]="rowData[col.field]" type="text" maxlength="50" class="form-control" />
                </ng-template>
                <!-- Show text box for "Property Name" column /-->
    
                <!-- Show Text for "Property Value" column if Property Value Type column is "String" -->
                <ng-template pTemplate="input" *ngIf="showPropValueTxtIfString(rowData, col)">
                  <input pInputText [(ngModel)]="rowData[col.field]" type="text" maxlength="50" class="form-control" />
                </ng-template>
                <!-- Show Text for "Property Value" column if Property Value Type column is "String" /-->
    
                <!-- Show Dropdown for "Property Value" column if Property Value Type column is "Boolean" -->
                <ng-template pTemplate="input" *ngIf="showPropValueDdlIfBoolean(rowData, col)">
                  <select class="form-control" [(ngModel)]="rowData[col.field]">
                    <option *ngFor="let item of booleanOptions" class="form-control" [value]="item.value">{{item.label}}</option>
                  </select>            
                </ng-template>
                <!-- Show Dropdown for "Property Value" column if Property Value Type column is "Boolean" /-->
    
                <!-- Show dropdown for "Property Value Type" column -->
                <ng-template pTemplate="input" *ngIf="showPropValueTypeEditDdl(col)">
                  <select class="form-control" [(ngModel)]="rowData[col.field]" (change)="refreshGrid()">
                    <option *ngFor="let item of propValueTypeOptions" class="form-control" [value]="item.value">{{item.label}}</option>
                  </select>
                </ng-template>
                <!-- Show dropdown for "Property Value Type" column /-->
                        </p-cellEditor>
                    </td>
                </tr>
            </ng-template>
        </p-table>
    </div>
    
    
    {{col.header}}
    {{rowData[col.field]}
    {{item.label}
    {{item.label}
    
    priming Table根据值更改的引用检测更改,因此只需创建新对象或进行深度复制即可解决问题

    要制作深度副本,请使用
    JSON.parse(JSON.stringify(a))
    或使用lodash

    refreshGrid() {
        let temp = [...this.tableItems];
        temp = JSON.parse(JSON.stringify(temp));
        this.tableItems = temp;
        setTimeout(() => {
          this.tableItems = [...temp];
        }, 0);
    }
    

    更新了

    工作得很有魅力