2014-01-21 52 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

相关问题