Как определить функцию внутри Angular -js Директива

Я создал директиву для выбора пользователей с помощью раскрывающегося элемента bootstrap. следующим образом.

Javascript

app.directive('usersDropdown', function(ConfigService,$http) {
    return {
        templateUrl: 'app/views/users_dropdown.html',
        link: function($scope, element, attrs) {
        });
    };
});

users_dropdown.html

<div class="btn-group pull-right" >
    <a class="btn dropdown-toggle" data-toggle="dropdown" href="">
        Select User
        <span class="caret"></span>
    </a>
    <ul class="dropdown-menu pull-right align-left" role="menu" aria-labelledby="dropdownMenu">
        <li ng-repeat = "userList in userLists"><a ng-click="getUserDetails('{{userList.SessionId}}')" style="cursor:pointer">{{userList.UserPartyName}}</a></li>
        <li ng-hide="userLists" style="cursor:pointer"><a>No Users</a></li>
    </ul>
</div>

Мне нужно создать функцию getUserDetails, которая должна вызываться при нажатии на пользователя из списка. Мой вопрос - как определить эту функцию внутри самой директивы? Я написал это в контроллере. Но проблема в том, что у меня есть несколько контроллеров. Это не очень хорошая практика, чтобы написать одну и ту же функцию во всех контроллерах. Если я могу написать функцию, общую для всех контроллеров, то есть внутри директивы, это будет хорошо. Если у вас есть хорошее решение, сообщите мне об этом.


Модификация

Я изменил свою директиву js следующим образом

app.directive('usersDropdown', function(ConfigService,$http) {
    return {
        templateUrl: 'app/views/users_dropdown.html',
        link: function($scope, element, attrs) {
            $scope.getUserDetails = function(user_id){
                console.log(user_id);
            }
        }
    };
});

Для этого я получаю результат в консоли как {{userList.SessionId}}. Не значение для этого. Но когда я проверял, функция пропускает ожидаемое значение. enter image description here

Тогда почему ожидаемое значение не попадает внутрь этой функции?


решаемые

Я решил проблему, изменив мою директиву html tamplate. Я удалил из него ' и {{ следующим образом.

ng-click="getUserDetails(userList.SessionId)"

Ответ 1

Функция директивы ссылки - это функция js, внутри которой вы можете что-либо сделать

app.directive('usersDropdown', function(ConfigService,$http) {
    return {
        scope : {},
        templateUrl: 'app/views/users_dropdown.html',
        link: function($scope, element, attrs) {
            $scope.somefunction = function(a) {
                // Do some stuff
            }
        }
     }; 
});

Также вы должны использовать изолированную область для выполнения, если вы хотите, чтобы эта функция не была доступна извне директивы.

Ответ 2

Если вы обнаружите, что вам нужна функция или переменная данных в разных местах вашего приложения, это может быть хорошим решением, чтобы переместить часть вашей логики в service.

Можно создать, например, файл user service, который должен обеспечить доступ к информации и методам, доступным всем пользователям.