2013-12-20 47 views
0

好的,所以我有這個服務依賴於用戶可以在應用程序界面中更改的另一個服務值。事情是這樣的:如何使服務依賴於另一個服務值

app.service('Applications', ['$resource', 'URL', 
    function ($resource, URL) { 
     var applicationsResource = $resource(URL + '/applications/:id', { id: '@id' }, { 
      query: { 
       method: 'GET', 
       isArray: true, 
       transformResponse: function(body, header) { 
        var response = angular.fromJson(body); 
        return response.data.applications; 
       } 
      } 
     }); 

     var applications = applicationsResource.query(function() { 
      applications.current = applications[0]; 
     }); 

     return applications; 
    } 
]); 

app.service('Users', ['$resource', 'URL', 'Applications', 
    function ($resource, URL, Applications) { 
     return $resource(URL + '/users/:id', { id: '@id' }, { 
      query: { 
       method: 'GET', 
       isArray: true, 
       headers: { 
        'User': Applications.current.username, 
        'Pass': Applications.current.password 
       }, 
       transformResponse: function(body, header) { 
        var response = angular.fromJson(body); 
        return response.data.users; 
       } 
      } 
     }); 
    } 
]); 

工作控制器代碼示例:

app.controller('usersController', ['$scope', '$resource', 'URL', 'Applications', 
    function ($scope, $resource, URL, Applications) { 
     $scope.users = []; 

     $scope.reload = function() { 
      $scope.loading = true; 
      var usersResource = $resource(URL + '/users/:id', { id: '@id' }, { 
       query: { 
        method: 'GET', 
        isArray: true, 
        headers: { 
         'User': Applications.current.username, 
         'Pass': Applications.current.password 
        }, 
        transformResponse: function(body, header) { 
         var response = angular.fromJson(body); 
         return response.data.users; 
        } 
       } 
      }); 
      $scope.users = usersResource.query(function() { 
       $scope.loading = false; 
      }); 
      /* 
      // after injecting Users, this is what I want to do, instead of what's above 
      $scope.users = Users.query(function() { 
       $scope.userTable.reload(); 
       $scope.loading = false; 
      }); 
      */ 
     }; 

     $scope.$watch('Applications.current', function (newApplication, oldApplication, scope) { 
      if (newApplication && newApplication !== oldApplication) { 
       scope.reload(); 
      } 
     }); 
    } 
]); 

我想取代我的用戶服務,usersResource,但是這正是我現在卡住。

問題是無論我做什麼,用戶服務上的Applications.current都始終爲空。 (在確保控制器上的Applications.current不爲空之後,我只使用這項服務)

如果我將資源直接移動到控制器,它可以工作,但我想將它們從控制器移開。

有關如何解決或改善此問題的任何提示?

+0

請張貼'有工作控制器代碼編輯,以證明我想要什麼User'電話及相應的控制代碼 –

+0

。 – aLfa

+0

好的,請發佈如何在無法使用時撥打服務。謝謝 –

回答

0

您應該知道$resource是異步的,並且您在實際得到服務器響應之前調用Users服務,並且已填充applications.current。這就是爲什麼Applications.currentnullUsers服務。

在你的情況我會使用Uses服務爲Applications

app.service('Applications', ['$resource', 'URL', 'Users', 
function ($resource, URL, Users) { 
     var applicationsResource = $resource(URL + '/applications/:id', { id: '@id' }, { 
      query: { 
       method: 'GET', 
       isArray: true, 
       transformResponse: function(body, header) { 
        var response = angular.fromJson(body); 
        return response.data.applications; 
       } 
      } 
     }); 

     var applications = applicationsResource.query(function() { 
      applications.current = applications[0]; 

        // call the Users 
        Users.query(applications.current) /**/ 

        return /* ... */; 

     }); 

     return applications; 
    } 
]); 
+0

在從服務器獲取任何結果之前,我沒有調用用戶服務。在控制器上我有這樣的:'if(Applications.current)$ scope.users = Users.query(function(){/ *失敗,因爲Applications.current爲null * /})' – aLfa

+0

您是否檢查過「應用程序.current'在控制器上有'username/pswd'? –

+0

請參閱我的編輯,我認爲您需要將用戶用於應用程序,因爲應用程序是根服務 –

相關問題