Подтвердить что ты не робот

Ошибка интерполяции AngularJS

Я показываю свойства комнаты как часть приложения управления комнатой, над которым я работаю, это вывод:

enter image description here

Как вы можете видеть, значение Beamer (Projector in english) - "Sony (лампа 01/12/2013)". Этот вывод правильный, но когда я открываю консоль, я вижу некоторые ошибки в отношении интерполяции:

enter image description here

Большее разрешение:

введите описание изображения здесь

"Can't interpolate: {{getBeamerString()}} TypeError: Cannot read property 'aanwezig' of undefined"

Это мой html partial:

<section class="eigenschappen">
    <table class="table table-striped table-hover table-bordered">
        <thead>
        <tr>
            <th>Eigenschap</th>
            <th>Waarde</th>
            <th>Bewerk</th>
        </tr>
        </thead>
        <tbody>

        ...

        <tr>
            <td><img class="ruimteNaam" src="../Images/Beamer.png" alt=""/>Beamer</td>
            <td>{{getBeamerString()}}</td>
            <td><img class="edit" src="../Images/Edit.png" alt=""/></td>
        </tr>

        ...

        </tbody>
    </table>
</section>

currentRuimte (CurrentRoom на английском языке) - это переменная, зависящая от области, которая получает свое значение, используя службу ресурсов, которая получает эти данные из моего mongoDB:

function RuimteController($scope, $routeParams, Ruimte) {

    $scope.currentRuimte = Ruimte.get({
        ruimteNaam: $routeParams.ruimteNaam
    });

    $scope.getBeamerString = function () {
        var beamer = $scope.currentRuimte.beamer;
        if(beamer.aanwezig == 'Ja'){
            return beamer.typeBeamer + ' (lamp: ' + beamer.datumLamp + ')';
        }else{
            return '-';
        }
    }
}

Когда я проверяю область с помощью batarang, я получаю следующее:

enter image description here

Почему я получаю ошибку и почему я все еще получаю правильный вывод? Есть ли способ предотвратить ошибку? Пожалуйста, исправьте меня столько, сколько сможете, Я новичок в AngularJS и Javascript в целом и пытаюсь расширить свой набор навыков.

4b9b3361

Ответ 1

Проблема заключается в том, что

$scope.currentRuimte = Ruimte.get({
    ruimteNaam: $routeParams.ruimteNaam
});

Является асинхронной операцией. $scope.currentRuimte будет пустым объектом, когда этот вызов вернется, а некоторое время спустя, когда данные будут доступны, он будет заполнен HTTP-ответом.

Это означает, что при первом просмотре вашего представления $scope.currentRuimte будет {}, и поэтому $scope.currentRuimte.beamer будет undefined, поэтому эта строка:

var beamer = $scope.currentRuimte.beamer;
if(beamer.aanwezig == 'Ja'){ /* <-- undefined.aanwezig ! */
}

собирается создать исключение. Вы можете решить эту проблему, убедившись, что beamer правдиво:

$scope.getBeamerString = function () {
    var beamer = $scope.currentRuimte.beamer;
    if(beamer && beamer.aanwezig == 'Ja'){
        return beamer.typeBeamer + ' (lamp: ' + beamer.datumLamp + ')';
    }else{
        return '-';
    }
}