0

给定以下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
4

2 回答 2

1

您正在auth.

当应用程序第一次启动时,控制器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

于 2013-10-09T00:28:12.710 回答
0

我认为如果您只想更改结束网址,

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

应该管用。

希望这有帮助

于 2013-10-08T21:08:03.787 回答