Решение обещаний AngularJS не обновляет GUI до следующего взаимодействия с пользователем - PullRequest
0 голосов
/ 13 ноября 2018

Я использую компонент стиля Angular2 в AngularJS. В моем компоненте есть функция, предназначенная для обновления графического интерфейса путем изменения параметров раскрывающегося списка:

    var ctrl = this;
    async function updateOptions(node) {
          var name = node.name;
          let result = await MyService.getResult(name);
          ctrl.options = result;
          console.log(ctrl.options); 
    }

Соответствующий HTML-код для отображения этих параметров:

  <select ng-if="$ctrl.getType() === 'dropdown'"
    class="form-control selectList"
    ng-model="$ctrl.value"
    ng-options="option.key as option.displayName for option in $ctrl.options">
  </select>

, где getType() всегда возвращает 'dropdown'.

Раскрывающийся список начинается пустым. Пользователь выбирает опцию из выпадающего списка. Консоль правильно регистрирует параметры и выпадающие обновления. Пользователь выбирает ДРУГОЙ вариант из выпадающего списка. Консоль снова регистрирует опции правильно. Но в этот раз выпадающий список НЕ обновляется. Все последующее время в раскрывающемся меню отображаются параметры ПРЕДЫДУЩЕЙ вещи, выбранной пользователем.

С нетерпением жду хорошей детективной работы. Рад предоставить больше фрагментов кода из этого большого проекта. Мне интересно, может ли это быть проблемой при обновлении AngularJS.

UPDATE:

Код MyService:

this.getResult = function(name) {
  return myFactory.getStuff(name).then(
    function(response) {
      return response.result.map(...);
    }
  );
};

Код MyFactory:

myFactory.getStuff = function(name) {
  return $http.get('/url/here/' + name)).then(
      function(response) {
        return response.data;
      }
    );
};

1 Ответ

0 голосов
/ 13 ноября 2018

await предназначен для собственных обещаний, которые поддерживаются браузером. Вы также можете использовать синтаксис .then для собственных обещаний.

Но AngularJS использует свои собственные обещания, исходящие от сервиса $q. Таким образом, вы должны использовать синтаксис .then, потому что браузер не знает об этих обещаниях.

Когда вы используете обещания из службы $q (например, когда вы используете $http), вам не нужно беспокоиться о циклах дайджеста, потому что дайджест запускается для вас, когда обещание выполнено. Но если вы используете собственные обещания в AngularJS, вам обычно приходится вручную запускать цикл дайджеста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...