Почему $digest() не вызывается автоматически из обратного вызова Parse?

У меня есть раскрывающийся список select2, который привязан к данным в моей области ($scope.makes). Он «живет» внутри ng-modal.

Я обновляю $scope.makes внутри обещания, которое является вызовом Parse.com (parse.cloud.run), но после этого DDL не ссылается на новые данные. Но если я добавлю вызов $scope.$digest(), он сработает. Почему это?

Это соответствующая часть модального контроллера:

    Parse.Cloud.run('getCarMakes', {}, {
        success: function (results) {
            console.log('C');
            if (results===undefined){
                console.log('The query has failed');
                return;
            }
            for (var i=0;i<results.length;i++){
                $scope.makes.push(results[i]);
            }
            $scope.$digest();

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

Вот часть HTML модального окна, которая имеет отношение

<label class="control-label" for="MakeSelect">Make </label>
<select class="form-control col-md-2" id="MakeSelect" name="make" ui-select2 ng-model="carDetails.make">
    <option ng-repeat="make in makes" value="{{ make }}">{{ make}}</option>
</select>

person slashms    schedule 22.05.2015    source источник


Ответы (1)


Это связано с тем, что success выходит за рамки Angular, вам нужно явно сообщить Angular, что что-то было обновлено, он должен запустить $digest или $apply (который внутренне вызывает $digest), чтобы также обновить его область.

Angular будет учитывать только те изменения модели, которые сделаны внутри контекста AngularJS, он не знает об обратном вызове и не может обновлять себя, как если бы изменение было внутри его области.

Для получения дополнительной информации о том, как сообщить Angular об обновлении области действия с помощью $digest() или $apply(), прочитайте эта статья или этот вопрос $apply vs $digest в директивном тестировании.

person Lev    schedule 22.05.2015