2013-10-08 70 views
0

鑑於以下AngularJS:AngularJS服務是通過REST設置屬性無法正確設置

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 

回答

0

我認爲,如果你只是想改變最終網址,

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

應該工作。

希望這有助於

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

+0

雖然這個作品與角度的視圖系統,它認識到'getUser'將恢復很重要* *任意字符串** **或承諾,取決於如果數據緩存或不可─在許多情況下,爲了避免奇怪的競爭條件錯誤(例如緩存承諾並每次返回),使公共API更加一致可能是必要的或謹慎的。 –