Могу ли я передать функцию другой функции, вызывающей эту функцию с зависимостями?

0

Название, вероятно, не имеет смысла, но в основном я хотел бы взять такой объект...

[
    {
        menuItemTitle: 'Edit Page',
        checkPermissions: function($http, $timeout){

            // Do something which uses $http or $timeout

        }
    }
]

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

Я думаю, что функция также должна запускаться в контексте, в котором она была вызвана, чтобы другие переменные в исходном контексте также были доступны на "этом" объекте, например

var siteId = 'google.com'

var menu = [
    {
        menuItemTitle: 'Edit Page',
        checkPermissions: function($http, $timeout){

            if(siteId === 'google.com'){
                $http.get(stuff);
            }

        }
    }
]

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

  • 0
    В конце концов, похоже, вы пытаетесь решить проблему маршрутизации? Это правильно? В этом случае показать определенный пункт меню, если пользователь играет определенную роль?
  • 0
    Да, действительно, но мне может понадобиться сделать это и в других местах. В этом случае мне нужно иметь функцию в объекте настроек и передать ее другой функции для последующего запуска, так же, как это делает UI-маршрутизатор и UI-bootstrap Modal с функцией «разрешения», обе позволяют вам передать функцию, и они решают ваши зависимости для вас.
Теги:
dependency-injection

1 ответ

1
Лучший ответ

Он должен использоваться так же, как и в Угловых и сторонних библиотеках для функций с поддержкой DI, $injector.invoke.

Он в основном вызывает checkPermissions (который должен быть функцией или встроенной аннотацией массива) с соответствующими зависимостями в качестве параметров, в качестве this контекста для функции может быть предоставлен необязательный аргумент.

var checkPermissionsResult = $injector.invoke(checkPermissions, this);
  • 0
    Спасибо, что указали мне в направлении .invoke (), это выглядит так, как мне нужно. Только одна вещь, которую я не понимаю - это текущий контекст, контекст, в котором вызывается функция, но если бы я хотел использовать контекст, в котором указана функция, как бы я это передал? Я не могу передать это как параметр, потому что все параметры должны быть службами, которые вводятся, не так ли? Я не могу выполнить функцию passThis: ($ timeout, $ http, this) {}. Может быть, мне нужно передать функцию и контекст как объект.
  • 0
    Более идиоматично использовать this в качестве контекста исполнения, а обратное часто приводит к боли. invoke принимает локальные зависимости, как обычно это обрабатывается в Angular. Вы можете сохранить желаемый контекст в виде массива menu prop и передать его в функцию как $injector.invoke(checkPermissions, null, { context: desiredContext }) , функция checkPermissions теперь может принимать локальную зависимость context .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню