我正在尝试将 Angular 2 Hero Example 扩展到 ag-grid SampleAppComponent。我使用 @input 创建了 CarDetailComponent,它允许我编辑汽车价格。修改后的汽车价格值与网格的 RowData 绑定并反映变化,但为了反映在网格上,网格上应该有显式的刷新调用。当用户再次单击一行时,我包含了这个调用。然后您会在网格中看到新的价格价值。 现在我希望从 CarDetailComponent @input 的“onKey”函数中进行刷新网格调用。我的问题是我无法从 CarDetailComponent 引用 SampleAppComponent 的实例。我尝试使用 SampleAppComponent 作为参数的构造函数,但得到“循环引用错误”。@Autowired 也不起作用:prop sampleAppComponent 仍未定义。提供的任何线索都会有很大帮助。下面是代码。 car-detail.component.ts:
import {Component, Input} from 'angular2/core';
import {Car} from './car';
import {SampleAppComponent} from './SampleAppComponent';
import {Bean} from 'ag-grid/main';
import {Autowired} from 'ag-grid/main';
@Component({
selector: 'my-car-detail',
template: `
<div *ngIf="car">
<h2>{{car.make}} details</h2>
<div>
<label>Model: </label>{{car.model}};
<label> Year: </label>{{car.year}}
</div>
<div>
<label>Price: </label>
<input [(ngModel)]="car.price" placeholder="price" (keyup)="onKey($event)"/>
</div>
</div>
`,
})
@Bean('CarDetailComponent')
export class CarDetailComponent {
@Autowired('sampleAppComponent') private sampleAppComponent: SampleAppComponent;
@Input() car: Car;
onKey(event:KeyboardEvent) {
console.log((<HTMLInputElement>event.target).value) ;
this.sampleAppComponent.gridOptions.api.refreshView(); // this.sampleAppComponent is undefined !!!
}
}
**SampleAppComponent.ts**
import {Component} from 'angular2/core';
import {AgGridNg2} from 'ag-grid-ng2/main';
import {GridOptions} from 'ag-grid/main';
import {GridOptionsWrapper} from 'ag-grid/main';
import {GridApi} from 'ag-grid/main';
import {Car} from './car';
import {CarService} from './car.service';
import {CarDetailComponent} from './car-detail.component';
import 'ag-grid-enterprise/main';
import {Utils as _} from 'ag-grid/main';
import {Bean} from 'ag-grid/main';
import {PostConstruct} from "ag-grid/main";
var carService: CarService;
console.log("Component start");
@Component({
selector: 'app',
template: `<ag-grid-ng2
class="ag-fresh" style="height: 300px"
[columnDefs]="columnDefs"
[rowData] = "rowData"
[enableColResize]="true"
[singleClickEdit]="true"
[enableSorting]="true"
[enableRangeSelection]="true"
(rowClicked)="onRowClicked($event)"
(cellValueChanged)="onKey($event)"
[gridOptions]="gridOptions"
>
</ag-grid-ng2>
<ul class="cars">
<li *ngFor="#car of cars"
[class.selected]="car === selectedCar"
(click)="onSelect(car)">
<span class="badge">{{car.make}}</span> {{car.price}}
</li>
</ul>
<my-car-detail [car]="selectedCar"></my-car-detail>
`,
directives: [AgGridNg2, CarDetailComponent],
providers: [CarService]
})
@Bean('SampleAppComponent')
export class SampleAppComponent {
public gridOptions: GridOptions;
private rowData: Object[];
selectedCar: Car;
private eRoot: HTMLElement;
private api: GridApi;
onRowClicked(event: Event) {
var currentRow: Car;
currentRow = <Car> event.data;
this.selectedCar = currentRow;
console.log('a row was clicked; row make: ' + currentRow.make + ', model: ' + currentRow.model + ', price: ' + currentRow.price + ", year: " + currentRow.year);
this.gridOptions.api.refreshView();
}
onKey(event:KeyboardEvent){
console.log("onKey Output: " + (<HTMLInputElement>event.target).value);
this.gridOptions.api.refreshView();
}
constructor(private _carService: CarService) {
console.log("in Grid constructor...");
carService = this._carService;
this._carService.getCars().then(CARS => this.rowData = CARS);
this.gridOptions = {
enableSorting: true,
rowData: this.rowData,
onReady: () => {
this.gridOptions.api.sizeColumnsToFit();
alert(this.gridOptions.api);
}
}
};
@PostConstruct
public init(): void {
console.log("in Grid POST constructor...");
}
columnDefs = [
{ headerName: "Make", field: "make" },
{ headerName: "Model", field: "model" },
{
headerName: "Price",
field: "price",
cellClass: 'rightJustify',
cellRenderer: function (params: any) {
return '$' + params.value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); //thanks http://stackoverflow.com/users/28324/elias-zamaria
}
},
{ headerName: "Year", field: "year" },
];
onSelect(car: Car) {
this.selectedCar = car;
console.log('a car was selected; car: make: ' + car.make + ', model: ' + car.model + ', price: ' + car.price + ", year: " + car.year);
};
}