2014-01-21 68 views
0

我有一個控制器和$ scope上聲明的變量。如何獲取訪問Controller中的變量的服務?

我有兩個數組存放對象,一個包含可用組,另一個包含用戶已經屬於的組。功能addUserToGroups()向服務器發出呼叫以接受選定的組並將用戶添加到這些組中。但後來我需要更新我的Dom上的兩個數組以反映變化。但是,該服務給我一個錯誤,assignedGroups數組未定義。

控制器:

spApp.controller('userCtrl', 
    function userCtrl($scope,userService,groupService){ 
     //Generate list of all users on the SiteCollection 
     $scope.users = userService.getUsers(); 
     $scope.selectedAvailableGroups; 
     $scope.selectedAssignedGroups; 
      $scope.availableGroups; 
      $scope.assignedGroups; 

     //Boolean used to disable add/remove buttons 
     $scope.selectedUser = false; 


     $scope.addUserToGroup = function(){ 
      userService.addUserToGroup($scope.selectedUser, $scope.selectedAvailableGroups) 
     }; 


    } 
); 

我一直在傳遞這些對象到控制器功能,因此該服務可以使用他們,我敢肯定,這將在這裏工作爲好,但就是真的是最好的方式去它?我覺得我只是在該控制器內創建一堆全局變量。可以嗎?

服務:

spApp.factory('userService', function(){ 
    var addUserToGroup = function (selectedUser, selectedAvailableGroups) { 
    var addToGroupPromises = []; 
    var selectedGroupsLength = selectedAvailableGroups.length 

    //Add user to selected groups on server 
    for (var i = 0; i < selectedGroupsLength; i++) { 
     addToGroupPromises[i] = $().SPServices({ 
     operation: "AddUserToGroup", 
     groupName: selectedAvailableGroups[i].name, 
     userLoginName: selectedUser.domain 
     });  
    }; 

    //when all users added, update dom 
    $.when.apply($,addToGroupPromises).done(function(){ 
     for (var i = 0; i < selectedGroupsLength; i++) { 
     assignedGroups.push(selectedAvailableGroups[i]); 
     //groupsAvailable.pop(selectedAvailableGroups[i]); 
     }; 
     alert(selectedUser.name + " added to: " + JSON.stringify(selectedAvailableGroups)); 
    }); 
    };  
}); 

HTML:

<button type="button" ng-disabled="!selectedUser" ng-click="addUserToGroup()">Add User</button> 

我還是很新的角度和試圖找出做到這一點的最好辦法。謝謝。

編輯:此外,我做傳統的方式只是將$ scope.asignedGroups傳遞到函數中,它的工作原理,但即使ng選項應該正在偵聽更改爲assignedGroups DOM不更新。我看到Batarang中的assignedGroups更改,但DOM不。

<select id="entityAssigned" multiple 
    ng-model="selectedAssignedGroups" 
    ng-options="g.name for g in assignedGroups | orderBy:'name'">      
</select> 
+0

是否有理由不能創建一個額外的函數參數來接受assignedGroups以便在服務中使用? – Hatjhie

+0

不,不是真的。我只是想知道是否有一些我錯過的Angular功能會讓這個更簡單。使用Angular的時候,所有東西都看起來如此插入,我想如果一個變量在控制器中是全局變量,並且服務被注入到控制器中,服務應該能夠讀取全局變量,而不必爲每個服務函數傳遞參數。 – Batman

+0

如果沒有,那很好。我只是想確保我以最好的方式做到這一點。 – Batman

回答

0

類似下面的代碼。

所以基本上,你通知角你想在你的服務中使用$ scope。

_app.services.YourService = function ($scope) { 
     var addUserToGroup = function (selectedUser, selectedAvailableGroups) { 
      var assignedGroups = $scope.assignedGroups; 
     } 
    } 

    _app.services.YourService.$inject = ['$scope']; 

希望它有幫助。

+0

我不確定你所做的是在控制器還是服務中發生。 – Batman

+0

它發生在服務中。 – Hatjhie

+0

但你仍然在函數addUserToGroup中傳遞參數,我不知道這是如何提高我的代碼。如果你注入$ scope,爲什麼你仍然需要將參數傳遞給函數 – Batman

相關問題