关于Angular和服务调用何时需要摘要的困惑

时间:2016-02-20 18:04:39

标签: angularjs

我遇到了一个问题,我设法找到了解决办法,但我正在寻找一些反馈,以确保我能以正确的方式做到这一点。

我在控制器中有一个函数来调用服务。如果失败,无论出于何种原因,我都会向用户显示错误消息。

//Controller
vm.login = function() {
  vm.error = "";
  Sessions.create(vm.user)
  .then(function(result) {
    $state.go("home");
  })
  .catch(function(result) {
    vm.error = result.data.errors;
  });
};

//Service
Sessions.create = function(data) {
  return $http.post(API + "sessions", data)
  .then(function(response) {
    return response.data;
  });
};

//View
.alert.alert-danger(role="alert" ng-show="vm.error") {{vm.error}}

上面的代码完全符合预期。当它命中vm.error = result.data.errors时,错误消息正确显示给用户。

当我尝试为该服务添加一些额外的功能(localforage)时,我得到了一些奇怪的行为。这是我的新代码:

//Controller
vm.newLogin = function() {
  vm.error = "";
  Sessions.login(vm.user)
  .then(function(result) {
    $state.go("home");
  })
  .catch(function(result) {
    vm.error = result.data.errors;
    $scope.$digest();  //NEED THIS?!?
  });
};

//Services
Sessions.create = function(data) {
  return $http.post(API + "sessions", data)
  .then(function(response) {
    return response.data;
  });
};

Sessions.login = function(data) {
  return new Promise(function(resolve, reject) {
    Sessions.create(data)
    .then(function(result) {
      //do stuff
    })
    .then(function(result) {
      return resolve(result);
    })
    .catch(function(err) {
      return reject(err);
    });
  });
};

//View
.alert.alert-danger(role="alert" ng-show="vm.error") {{vm.error}}

使用此代码,newLogin中设置的错误消息不会显示给用户,除非我在其后添加$scope.$digest();。我在这里做错了吗?我可以在catchlogin内的newLogin中记录并查看错误消息。为什么只在第二个版本中需要摘要?

1 个答案:

答案 0 :(得分:0)

使用浏览器Promise API存在问题。您应该使用$q服务来创建承诺。它与AngularJS框架更好地集成。请参阅AngularJS $q Service API Reference

通常,您不直接在控制器或指令中调用$digest()。相反,您应该调用$apply()(通常来自指令内),这将强制$digest()。但在您的情况下,AngularJS $q服务将负责调用$apply()。有关详细信息,请参阅AngularJS $rootScope.scope API Reference -- $digest