DevExpress' DevExtreme for Angular2 and pre

I'm using DevExpress' DevExtreme with Angular2. I have a data grid (below) that lists states and asks the user to select some states. It is possible that some states have already been stored in the database. How do I set the previously selected states? I can see in the documentation that I should use dataGrid.instance.selectRows(arrayOfPreviouslySelectedStates) but dataGrid is instantiated sometime after I try to set it which is in the ngOnInit() .

My HTML grid:

<dx-data-grid #statesGrid id="statesContainer" [dataSource]="states" [selectedRowKeys]="[]" [hoverStateEnabled]="true" [showBorders]="true" [showColumnLines]="true" [showRowLines]="true" [rowAlternationEnabled]="true">
    <dxo-sorting mode="multiple"></dxo-sorting>
    <dxo-selection mode="multiple" [deferred]="true"></dxo-selection>
    <dxo-paging [pageSize]="10"></dxo-paging>
    <dxo-pager [showPageSizeSelector]="true" [allowedPageSizes]="[5, 10, 20]" [showInfo]="true"></dxo-pager>
    <dxo-filter-row [visible]="true"></dxo-filter-row>
    <dxi-column dataField="abbreviation" [width]="100"></dxi-column>
    <dxi-column dataField="name"></dxi-column>
</dx-data-grid>

My componenet:

import 'rxjs/add/operator/switchMap';
import { Component, OnInit, ViewContainerRef, ViewChild } from '@angular/core';
import { CompanyService } from './../../../shared/services/company.service';
import { StateService } from './../../../shared/services/state.service';
import notify from 'devextreme/ui/notify';
import { DxDataGridModule, DxDataGridComponent } from 'devextreme-angular';

@Component({
  selector: 'app-company-detail',
  templateUrl: './company-detail.component.html'
})
export class CompanyDetailComponent implements OnInit {
  @ViewChild(DxDataGridComponent) dataGrid: DxDataGridComponent;

  companyStates: Array<ICompanyState>;
  states: Array<IState>;

  constructor(private CompanyService: CompanyService, private StateService: StateService) { }

  ngOnInit() {
    this.StateService.getStates().subscribe((states) => {
        this.getSelectedStates();
        this.states = states
    });
  }

  public getSelectedStates = (): void => {
      this.CompanyService.getStates(id).subscribe((states) => {
        let preselectedStates: Array<IState> = this.companyStates.map((state) => {
            return { abbreviation: state.Abbreviation, name: state.Name }
        });

        // I get an error here that says that dataGrid is undefined.
        this.dataGrid.instance.selectRows(preselectedStates, false);
      }
  }
}

Thanks to @yurzui 's comment I was able to figure out my problems in the following way. [selectedRowKeys] deals with all preselection. It's "problem" is that it doesn't update itself when additional selections are made. So, I listened for onSelectionChanged and passed the event, which contains data about many things regarding selection, into my custom function which updates the selectedStates which I then use to save the data to the database when the save button is clicked.

Gets the preselected states from the database

public getCompanyStates = (): void => {
    this.CompanyService.getStates().subscribe((states) => {
        this.selectedStates = states;
    });
}

Event handler

public onSelectionChanged = (e): void => {
    this.selectedStates = e.selectedRowKeys;
}

The dx-data-grid portion of the HTML

<dx-data-grid #statesGrid id="statesContainer" 
    (onSelectionChanged)="onSelectionChanged($event)" 
    [selectedRowKeys]="selectedStates"
    [dataSource]="states">
    ...
</dx-data-grid>
链接地址: http://www.djcxy.com/p/5240.html

上一篇: customizeText devextreme无法正常工作

下一篇: DevExpress'DevExtreme for Angular2和pre