【问题标题】:agGrid how to refresh after change value of checkboxag Grid如何在更改复选框的值后刷新
【发布时间】:2021-01-28 19:04:54
【问题描述】:

我的 agGrid 组件有问题,所以我的观点是将复选框显示为单元格中的值,所以我这样做了,然后我添加了额外的复选框来选择表中的所有复选框,但它不能按我想要的那样工作,如你所见如果选中了所有复选框,则在屏幕上,所以这个额外的复选框也(屏幕) screen1 然后我取消选中其中一个选项,但额外的复选框不会更改 screen2 但应该取消选中。我找到了使用refreshCells({ force: true }); 的解决方案,但是这种方法会刷新所有表,因此取消选中需要很长时间。要创建此复选框,我使用 vuetify 组件

我的 agGridSetup

<template>
  <v-container>
    <ag-grid-vue
      style="width: 100%; height: 375px"
      class="table ag-theme-balham"
      @grid-ready="onGridReady"
      :columnDefs="agGridColDefs"
      :groupMultiAutoColumn="true"
      :enableRangeSelection="true"
      :animateRows="true"
      :row-data="rowData"
    ></ag-grid-vue>
  </v-container>
</template>
<script lang="ts">
import { Component, Vue, Prop, Ref, Watch } from "vue-property-decorator";
import { BaseTableColumnDef } from "@/models/Table/BaseTableColumnDef.ts";
import {
  ColDef,
  ColDefUtil,
  ColumnApi,
  GridApi,
  GridOptions,
  GridReadyEvent,
  IDatasource,
  IGetRowsParams,
} from "ag-grid-community";
import { AgGridVue } from "ag-grid-vue";
import "ag-grid-enterprise";
import "ag-grid-community/dist/styles/ag-grid.css";
import "ag-grid-community/dist/styles/ag-theme-alpine.css";
@Component({
  components: {
    AgGridVue,
  },
})
export default class Table extends Vue {
  gridOptions!: GridOptions;
  agGridColDefs!: ColDef[];
  @Prop() private baseTableColumnDefs: BaseTableColumnDef[];
  @Prop() private rowData: any;
  private columnDefs: ColDef;
  private agGridApi!: GridApi;
  private agGridColumnApi!: ColumnApi;

  beforeMount() {
    this.initGridOptions();
    this.initGirdColDef();
  }

  onGridReady(gridReadyEvent: GridReadyEvent) {
    this.agGridApi = gridReadyEvent.api;
    this.agGridColumnApi = gridReadyEvent.columnApi;
    if (this.agGridApi) {
      this.agGridApi.sizeColumnsToFit();
    }
  }

  private initGridOptions() {
    this.gridOptions = {
      defaultColDef: {
        headerValueGetter: (params: any) => {
          return this.$t(params.baseTableColumnDefs.headerName);
        },
      },
    };
  }
  private initGirdColDef() {
    this.agGridColDefs = this.baseTableColumnDefs.map((colDef) =>
      this.mapSingleColDef(colDef)
    );
  }

  private mapSingleColDef(colDef: BaseTableColumnDef): ColDef {
    return {
      ...colDef,
      resizable: true,
    };
  }
}
</script>
<style lang="scss" scoped>
</style>

列定义

private columnDefs: BaseTableColumnDef[] = [
    {
      headerName: "Kategorie",
      field: "permissionResourceType",
      sortable: true,
      rowGroup: true,
      hide: true,
    },
    {
      headerName: "Berechtigung",
      field: "name",
      sortable: true,
    },
    {
      headerName: "Anzeigen",
      field: "showValue",
      sortable: true,
      cellRendererFramework: UserGroupCheckbox,
    },
    {
      headerName: "Bearbeiten",
      field: "editValue",
      sortable: true,
      cellRendererFramework: UserGroupCheckbox,
    },
    {
      headerName: "Löschen",
      field: "deleteValue",
      sortable: true,
      cellRendererFramework: UserGroupCheckbox,
    },
    {
      headerName: "Zulassen",
      field: "permitValue",
      sortable: true,
      cellRendererFramework: UserGroupCheckbox,
    },
  ];

复选框组件

<template>
  <span>
    <ValidationProvider>
      <v-checkbox
        class="checkbox"
        v-model="selectAllShowObjectValue"
        v-on:change="onChangeAllShowObjectValue()"
        :indeterminate="selectAllShowIndeterminate"
        v-if="isSelectAllShow"
      ></v-checkbox>
      <v-checkbox
        class="checkbox"
        v-model="selectAllEditObjectValue"
        v-on:change="onChangeAllEditObjectValue()"
        v-if="isSelectAllEdit"
      ></v-checkbox>
      <v-checkbox
        class="checkbox"
        v-model="selectAllDeleteObjectValue"
        v-on:change="onChangeAllDeleteObjectValue()"
        v-if="isSelectAllDelete"
      ></v-checkbox>
      <v-checkbox
        class="checkbox"
        v-model="selectAllPermitProcessValue"
        v-on:change="onChangeAllPermitProcessValue()"
        v-if="isSelectAllPermit"
      ></v-checkbox>
      <v-checkbox
        class="checkbox"
        v-model="selectAllPermitActionValue"
        v-on:change="onChangeAllPermitActionValue()"
        v-if="isSelectAllPermit"
      ></v-checkbox>

      <v-checkbox
        class="checkbox"
        v-model="params.data.showValue"
        v-on:change="
          setCheckboxForObjectGroupShow();
          setShowValue();
        "
        v-if="isShow"
      ></v-checkbox>
      <v-checkbox
        class="checkbox"
        v-model="params.data.editValue"
        v-on:change="setEditOrDeleteValue()"
        v-if="isEdit"
      ></v-checkbox>
      <v-checkbox
        class="checkbox"
        v-model="params.data.permitValue"
        v-if="isPermit"
      ></v-checkbox>
      <v-checkbox
        class="checkbox"
        v-model="params.data.deleteValue"
        v-on:change="setEditOrDeleteValue()"
        v-if="isDelete"
      ></v-checkbox>
    </ValidationProvider>
  </span>
</template>
<script lang="ts">
import { is } from "vee-validate/dist/rules";
import { params } from "vee-validate/dist/types/rules/alpha";
import { Component, Vue, Prop, Ref, Watch } from "vue-property-decorator";
import { ValidationProvider } from "vee-validate";

@Component({
  components: {
    ValidationProvider,
  },
})
export default class UserGroupCheckbox extends Vue {
  params: any = {};
  isShow: boolean = false;
  isEdit: boolean = false;
  isPermit: boolean = false;
  isDelete: boolean = false;

  isSelectAllShow: boolean = false;
  isSelectAllEdit: boolean = false;
  isSelectAllPermit: boolean = false;
  isSelectAllDelete: boolean = false;

  selectAllDeleteObjectValue: boolean = false;
  selectAllPermitProcessValue: boolean = false;
  selectAllPermitActionValue: boolean = false;
  selectAllEditObjectValue: boolean = false;
  selectAllShowObjectValue: boolean = true;

  selectAllShowIndeterminate: boolean = false;

  beforeMount() {
    if (this.params.colDef.headerName === "Anzeigen") {
      if (this.params.data !== undefined && this.params.data !== null) {
        if (this.params.data.showModifiable) {
          this.isShow = true;
        } else {
          this.isShow = false;
        }
      } else {
        if (this.params.node.key === "Objekte") {
          this.setCheckboxForObjectGroupShow();
          this.isSelectAllShow = true;
        } else {
          this.isSelectAllShow = false;
        }
      }
    }
    if (this.params.colDef.headerName === "Bearbeiten") {
      if (this.params.data !== undefined && this.params.data !== null) {
        if (this.params.data.editModifiable) {
          this.isEdit = true;
        } else {
          this.isEdit = false;
        }
      } else {
        if (this.params.node.key === "Objekte") {
          this.isSelectAllEdit = true;
        } else {
          this.isSelectAllEdit = false;
        }
      }
    }
    if (this.params.colDef.headerName === "Löschen") {
      if (this.params.data !== undefined && this.params.data !== null) {
        if (this.params.data.deleteModifiable) {
          this.isDelete = true;
        } else {
          this.isDelete = false;
        }
      } else {
        if (this.params.node.key === "Objekte") {
          this.isSelectAllDelete = true;
        } else {
          this.isSelectAllDelete = false;
        }
      }
    }
    if (this.params.colDef.headerName === "Zulassen") {
      if (this.params.data !== undefined && this.params.data !== null) {
        if (this.params.data.permitModifiable) {
          this.isPermit = true;
        } else {
          this.isPermit = false;
        }
      } else {
        if (
          this.params.node.key === "Aktionen" ||
          this.params.node.key === "Prozesse"
        ) {
          this.isSelectAllPermit = true;
        } else {
          this.isSelectAllPermit = false;
        }
      }
    }
  }

  private onChangeAllShowObjectValue() {
    if (this.selectAllShowObjectValue) {
      this.params.node.childrenAfterGroup.forEach((element: any) => {
        if (element.data.showModifiable) {
          element.data.showValue = true;
        }
      });
    } else if (!this.selectAllShowObjectValue) {
      this.params.node.childrenAfterGroup.forEach((element: any) => {
        if (element.data.showModifiable) {
          element.data.showValue = false;
        }
      });
    }
  }

  private onChangeAllEditObjectValue() {
    if (this.selectAllEditObjectValue) {
      this.params.node.childrenAfterGroup.forEach((element: any) => {
        if (element.data.editModifiable) {
          element.data.editValue = true;
        }
      });
    } else if (!this.selectAllEditObjectValue) {
      this.params.node.childrenAfterGroup.forEach((element: any) => {
        if (element.data.editModifiable) {
          element.data.editValue = false;
        }
      });
    }
  }

  private onChangeAllDeleteObjectValue() {
    if (this.selectAllDeleteObjectValue) {
      this.params.node.childrenAfterGroup.forEach((element: any) => {
        if (element.data.deleteModifiable) {
          element.data.deleteValue = true;
        }
      });
    } else if (!this.selectAllDeleteObjectValue) {
      this.params.node.childrenAfterGroup.forEach((element: any) => {
        if (element.data.deleteModifiable) {
          element.data.deleteValue = false;
        }
      });
    }
  }

  private onChangeAllPermitProcessValue() {
    if (this.selectAllPermitProcessValue) {
      this.params.node.childrenAfterGroup.forEach((element: any) => {
        if (element.data.permitModifiable) {
          element.data.permitValue = true;
        }
      });
    } else if (!this.selectAllPermitProcessValue) {
      this.params.node.childrenAfterGroup.forEach((element: any) => {
        if (element.data.permitModifiable) {
          element.data.permitValue = false;
        }
      });
    }
  }
  private onChangeAllPermitActionValue() {
    if (this.selectAllPermitActionValue) {
      this.params.node.childrenAfterGroup.forEach((element: any) => {
        if (element.data.permitModifiable) {
          element.data.permitValue = true;
        }
      });
    } else if (!this.selectAllPermitActionValue) {
      this.params.node.childrenAfterGroup.forEach((element: any) => {
        if (element.data.permitModifiable) {
          element.data.permitValue = false;
        }
      });
    }
  }
  private setCheckboxForObjectGroupShow() {
    if (
      this.params.node.childrenAfterGroup !== undefined &&
      this.params.node.childrenAfterGroup !== null
    ) {
      this.params.node.childrenAfterGroup.forEach((child: any) => {
        if (!child.data.showValue && child.data.showModifiable) {
          this.selectAllShowObjectValue = false;
          this.selectAllShowIndeterminate = true;
        }
      });
    } else {
      this.params.node.parent.childrenAfterGroup.forEach((child: any) => {
        if (!child.data.showValue && child.data.showModifiable) {
          this.selectAllShowObjectValue = false;
          this.selectAllShowIndeterminate = true;
          console.log(child);
          //this.params.api.refreshCells({ force: true });
        }
      });
    }
  }
  private setEditOrDeleteValue() {
    const rowData = this.params.data;
    if (rowData.editModifiable || rowData.deleteModifiable) {
      if (rowData.editValue || rowData.deleteValue) {
        this.params.data.showValue = true;
      }
    }
  }
  private setShowValue() {
    if (!this.params.data.showValue) {
      this.params.data.editValue = false;
      this.params.data.deleteValue = false;
    }
  }
}
</script>
<style scoped>
.checkbox {
  margin: auto;
}
</style>

【问题讨论】:

    标签: vue.js vuetify.js ag-grid


    【解决方案1】:

    您可以refresh特定的行和列来提高性能

    refreshCells({
      force: true,
      columns: ['colId1', 'colId2'],
      rows: [rowNode1, rowNode2],
    });
    

    但是如果您希望复选框选择/取消选择行,您可以通过在列定义中启用它来使用 agGrid 内置的复选框选择

    {
      field: '',
      checkboxSelection: true,
      headerCheckboxSelection: true,
      suppressRowClickSelection: true,
    },
    {
      field: 'id',
      ...
    }
    ...
    

    【讨论】:

    • 是的,我知道我可以刷新行和列,但在我的情况下它不起作用,这意味着行正在刷新,但复选框仍然相同,我不能使用 agGrid 内置复选框,因为我不要只选择此复选框的行,但感谢您的回答:)
    • @RadosławŁuczak 您应该在问题中添加复选框渲染器代码,以便其他人可以帮助您调试问题。
    • 我看到我开始滚动表复选框已更新:)
    【解决方案2】:

    我解决了这个问题。 解决方案是使用api.redrawRows 瞬间的api.refreshCells

    解决我问题的代码

    const row = [];
    
    row.push(child.parent);
    this.params.api.redrawRows({ rowNodes: row });
    

    【讨论】:

      猜你喜欢
      • 2020-10-07
      • 2019-08-06
      • 2018-08-10
      • 1970-01-01
      • 2022-01-14
      • 2019-09-15
      • 2016-05-20
      • 2018-10-23
      • 2021-09-27
      相关资源
      最近更新 更多