objec является нулевым в Chrome, а не нулевым в IE - PullRequest
0 голосов
/ 19 марта 2019

У меня есть очень очень странная проблема, которую я не могу понять, при использовании "Chrome" мой объект иногда становится нулевым, но в IE он всегда работает.Это происходит только для всех моих выпадающих списков, однако другие элементы управления, такие как текстовое поле, работают как положено ... вот упрощенная версия моего кода.

примечание: dropdrown правильно связывается, поэтому значения доступны вHTML

HTML (с использованием реактивных форм)

     <label for="costCenterId" class="control-label">Cost Center</label>

    <p-dropdown [options]="iCostCenter" optionLabel="cost_center_name"  styleClass="form-control"
 formControlName="costCenter" id="costCenterId" name="costCenter" dataKey="cost_center_id"
          [filter]="true" filterBy="value.cost_center_name">
 </p-dropdown>

TS

    export interface ICostCenter{

        cost_center_id: number,
        cost_center_name: string
    }

    iCostCenter: ICostCenter[]=[];

    ngOnInit() {
     this.getAllCostCenetrs();
this.populateHeaderDet();

    }

    getAllCostCenetrs() {
            this._appParams.getAllCostCenters()
                .subscribe(
                data => {
                    this.iCostCenter = data.result;


                },
               error => 'GetAllCostCenetrs Method: ');

        }

populateHeaderDet() in chrome iCostCenter become null
    {
    this.ersaForm.patchValue({

                   costCenter: this.iCostCenter.find(cc => cc.cost_center_name === this.iRequest.costCenter.cost_center_name)

)};

JSON

{
  "result": [
    {
      "cost_center_id": 1,
      "cost_center_name": "1"
    },
    {

      "cost_center_id":2,
      "cost_center_name": "2"
    }
   ]
}

1 Ответ

1 голос
/ 19 марта 2019

Я бы предположил, что это потому, что iCostCenter заполняется внутри вашей подписки, и populateHeaderDet() вызывается до того, как ответ возвращается от getAllCostCenters().

Попробуйте позвонить populateHeaderDet() после того, как вы назначите iCostCenter вместо

ngOnInit() {
    this.getAllCostCenetrs();
}

getAllCostCenetrs() {
    this._appParams.getAllCostCenters().subscribe(
        data => {
            this.iCostCenter = data.result;
            this.populateHeaderDet();
            },
            error => 'GetAllCostCenetrs Method: ');
    }

populateHeaderDet()
{
    this.ersaForm.patchValue({
               costCenter: this.iCostCenter.find(cc => cc.cost_center_name === this.iRequest.costCenter.cost_center_name)
)};
<ч />

Редактировать

Из комментариев кажется, что на самом деле вы хотите дождаться завершения нескольких наблюдаемых, прежде чем вызывать метод populateHeaderDet(). Одним из подходов к решению этой проблемы было бы использование метода rxjs zip .

Поскольку я не видел остальную часть вашего кода, трудно сказать наверняка, но вы можете попробовать что-то вроде этого

const costCentres$ = this._appParams.getAllCostCenters();
const companyCodes$ = this._appParams.getAllCompanyCodes()

zip(
 costCentres$,
 companyCodes$,
 (costCentres: string[], companyCodes: string[]) => ({costCentres, companyCodes}))
 .subscribe(data => {
   this.iCostCenter = data.costCentres;
   this.companyCodes = data.companyCodes;

   this.populateHeaderDet()
 });
...