Angular 6 - нулевая, неопределенная проверка не работает -ERROR TypeError: Невозможно прочитать свойство 'Region' из undefined - PullRequest
1 голос
/ 22 апреля 2019

Этот раскрывающийся список кендо существует в виде столбца сетки кендо.

 <kendo-dropdownlist [data]="regions"
                     [textField]="'Region'"
                     [value]="'RegionMasterID'"
                     [formControl]="formGroup.get('Region')"
                     [filterable]="true"
                     (valueChange)="handleRegionChange($event, dataItem)"
                     (filterChange)="handleRegionFilter($event)">

 </kendo-dropdownlist>

Вот код компонента:

handleRegionChange(value: any, dataItem: any) {

 if ((dataItem.Region !== null || dataItem.Region !== undefined) && value.Region) {
            this.SelectedRegion = value.Region;
            dataItem.Region = value.Region;
            dataItem.RegionMasterID = value.Region == "" ? '' : value.RegionMasterID;
        }
        else {
            this.SelectedRegion = '';
            dataItem.Region = '';
            dataItem.RegionMasterID = '';
        }

        this.update(dataItem);
    }

В событии handleRegionChange я пытаюсь проверить, сделал ли пользователь какой-либо выбор. Если да, то if-block в противном случае блок. Если пользователь щелкает раскрывающийся список и не делает никакого выбора, dataItem.Region имеет значение null, но вместо выполнения блока else в консоли выдается ошибка:

ERROR TypeError: Cannot read property 'Region' of undefined

Пожалуйста, руководство, как решить проблему

1 Ответ

0 голосов
/ 22 апреля 2019

Вам нужно проверить, существует ли dataItem, прежде чем пытаться получить доступ к его атрибутам, это должно помочь. Добавьте это в ваш оператор if в начале.

if (dataItem && (dataItem.Region !== null || dataItem.Region !== undefined) && value.Region)

Если dataItem не соответствует действительности и не был передан, то это должно перейти прямо к блоку else.

Проблема в попытке доступа к атрибуту, который не существует. Как и undefined.Region, вы получите ошибку при проверке неопределенного значения. && убедится, что dataItem верен (имеет значение) перед доступом. Таким образом, dataItem.Region никогда нельзя проверить, если dataItem не существует.

Глядя на документацию, я думаю, что вы можете передать только $event в качестве единственного аргумента. Если все значения уникальны и не повторяются, попробуйте.

(valueChange)="handleRegionChange($event)"

public handleRegionChange(value) 
{
    let selected = this.regions.find(item => item.value === value);
    if (selected)
    { // your code. }
    else 
    { // your code. }
}
...