2014-01-21 4 views
0

У меня есть контроллер и переменные, объявленные в $ scope.Как получить услугу для доступа к переменным в контроллере?

У меня есть два массива, содержащих объекты, один из которых содержит доступные группы, а другой содержит группы, к которым пользователь уже принадлежит. Функция addUserToGroups() делает вызов на сервер, чтобы отобрать выбранные группы и добавить пользователя в эти группы. Но тогда мне нужно обновить два массива на моем Доме, отражая изменения. Однако служба сообщает мне об ошибке, что массив 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> 

Я все еще очень новый Угловое и пытается выяснить, лучший способ сделать это. Благодарю.

EDIT: Кроме того, я сделал это традиционным способом просто передать $ scope.asignedGroups в функцию, и он работает, но DOM не обновляется, хотя ng-параметр должен прослушиваться для измененных назначенных групп. Я вижу, что назначенные группы меняются в Batarang, но DOM этого не делает.

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

Есть ли причина, почему вы не могли создать один дополнительный аргумент функции для приема назначенных групп для использования в Сервисе? – Hatjhie

+0

Нет, не совсем. Мне просто интересно, есть ли какая-то Угловая функция, которую я пропускаю, что сделало бы это проще. С 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

Смежные вопросы