如何获得访问Controller中变量的服务?

时间:2014-01-21 01:08:55

标签: javascript angularjs

我在$ scope上声明了一个控制器和变量。

我有两个包含对象的数组,一个包含可用组,另一个包含用户已经属于的组。函数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>

我仍然是Angular的新手,并试图找出最好的方法来做到这一点。谢谢。

编辑:另外,我这样做的传统方式只是将$ scope.asignedGroups传递给函数并且它可以工作,但是即使ng-option应该监听更改为assignedGroups,DOM也不会更新。我看到已分配的组在Batarang中发生了变化,但DOM却没有。

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

1 个答案:

答案 0 :(得分:0)

类似下面的代码。

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

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

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

希望它有所帮助。