在AngularJS中如何从服务本身内部的回调中修改服务属性

时间:2016-07-26 15:48:00

标签: javascript angularjs angularjs-scope

我有一个工厂进行http调用,在错误回调中我想设置一个属性值,例如this.password = null,但this.password并不指向密码。

另一方面,当我执行POST时,数据被正常发送:password: this.password

密码属性的范围应该不同吗?或者我错过了其他什么?

.factory('LogInService', function($http) {

  return {
    username: null,
    password: null,
    logIn: function() {
      return $http({
        method: 'POST',
        url: 'http://my-domain/api/signin',
        data: {
          username: this.username,
          password: this.password
        }
      })
      .then(
        function(success){

        },
        function(err){
          // reset password field
          this.password = null;  // <-- not working
        }
      );
    }
  }
});

我可以将所有属性和方法设置为var然后返回它,但我更喜欢上面的方法。我的意思是:

var myService = {
    // my property and methods...
}

errorCallBack = function(){
  myService.password = null;
}

return myService;

2 个答案:

答案 0 :(得分:2)

您有一个范围问题。应该很容易做到这样的事情。一如既往,未经测试,但似乎它会起作用。

.factory('LogInService', function($http) {

  return {
    username: null,
    password: null,
    logIn: function() {
      var svc = this; //<----
      return $http({
        method: 'POST',
        url: 'http://my-domain/api/signin',
        data: {
          username: svc.username, //<---
          password: svc.password  //<---
        }
      })
      .then(
        function(success){

        },
        function(err){
          // reset password field
          svc.password = null;  //<----
        }
      );
    }
  }
});

答案 1 :(得分:1)

您需要learn about this

您可以使用arrow functions修复您的问题,而这不会改变this的含义。

您可能希望use Babel将ES6代码编译到ES5中,以便浏览器在现代代码库中表现良好。