【问题标题】:AngularJS Promise does not run a digestAngularJS Promise 不运行摘要
【发布时间】:2019-06-09 09:01:55
【问题描述】:

我是 Promise 概念的新手,在尝试提交登录表单时遇到问题。

当 promise 解决后,我想通过更改范围变量的值来更新 UI。

这是被调用的控制器方法

 $ctrl.loginForm = function(isValid) {
    // check to make sure the form is completely valid

    if (isValid) {
      LoginService.login($ctrl.user).then(function (value) {
          $ctrl.loginError = false;
          var cookie = value.token;
      }, function (reason) {
          $ctrl.loginError = true;

      });
    }

  };

这是我的服务方法

  service.login = function(credentials) {
    return new Promise((resolve, reject) => {
      $http.post(AppConst.Settings.apiUrl + 'api-token-auth/',credentials).success((data) => {
        resolve(data);
      }).error((err, status) => {
        reject(err, status);
      });
    });
  };

因此,一旦 promise 得到解决,控制器中的 $ctrl.loginError 就会更改其值,但不会在 UI 上更新。

我尝试过使用$apply 并且它有效,但我不明白为什么我必须使用$apply!我以为是默认启动摘要循环的!

我做错了吗?

【问题讨论】:

  • 在服务中不需要像这样解决承诺。你可以直接返回你的http调用
  • $http 服务返回一个承诺,在处理后触发一个摘要。不需要将其包装在本机承诺上。您应该接受@Denis Reshetniak 的回答。

标签: angularjs promise angular-promise angularjs-digest


【解决方案1】:

$http 方法返回一个承诺,它是一个 $q 服务。所以,问题是您使用本机承诺包装器,它不会告诉 Angular 的范围来运行 $apply 方法。 将您的服务更改为关注

service.login = function(credentials) {
  return $http.post(AppConst.Settings.apiUrl + 'api-token-auth/',credentials);
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多