通过REST设置属性的AngularJS服务无法正确设置

时间:2013-10-08 17:25:41

标签: javascript rest angularjs

鉴于以下AngularJS:

var app = angular.module('testing',[]);
app.service('auth',function($http)  
{  
    var user = '';  
    $http.get("http://localhost/auth/user").success(function(data)  
    {  
        user = data.user;    
        console.log("User: " + user); //prints Woot4Moo
    });
    return{  
         getUser: function(){    
              return user;  
         }  
     };
});

JSON回复:

{"user":"Woot4Moo"}

在控制器中使用:

app.controller('controller',function($http,auth)  
{  
          $http({  
                url:"http://localhost/my/rest/call/",  
                method: "GET",  
                params: {person: auth.getUser()}   //this comes back empty
          }).success(function(data){...}  
};  

重申如何让我的结束网址成为这样:

http://localhost/my/rest/call/?user='Woot4Moo'

而不是像这样的无效:

http://localhost/my/rest/call/?user=     <- the empty string

2 个答案:

答案 0 :(得分:1)

您正在auth中进行异步HTTP呼叫。

当应用程序首次启动时,控制器会立即从您的服务请求user的值并获取设置为空的字符串。只有在调用稍后触发的成功回调时,才会为user设置值。

你可以这样做:

app.service('auth',function($http)  
{  
    var user; 
    function queryUser() {
      return $http.get("http://localhost/auth/user").then(function(data)  
      {  
          user = data.data.user;
          return user;
      });
    }

    function getUser() {
      return user ? user : queryUser();
    }

    return{  
         getUser: getUser
     };
});

确保在初次请求用户时调用queryUser,然后将值缓存到user后,所有后续调用都将返回缓存值。

如果需要,在服务内部调用函数getUser()以在初始化时设置值。

我还会考虑更改控制器中的逻辑。立即取决于异步调用可能不是一个好主意!

示例Plunker

答案 1 :(得分:0)

我认为如果你只是想改变最终网址,

$location.url("my/rest/call/?user='"+user+"'");

应该有用。

希望这有帮助