Разделение пользовательского интерфейса и контроллеров во вложенной пользовательской директиве

0

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

Я думаю, что это позволит мне полностью инкапсулировать детали каждой страницы мастера. Например:

<custom-wizard-tag>
    <enter-name-page page="1" name-placeholder="name"/>
    <enter-address-page page="2" name-placeholder="name" address-placeholder="address" last-page/>
</custom-wizard-tag>

Все идет нормально. Каждый из вышеперечисленных элементов имеет свою собственную директиву, и каждый из них указывает шаблонUrl и контроллер (например, templateUrl может быть предоставлен как атрибут).

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

Я новичок в этом, так что медведь со мной...

Я прочитал документацию по directive и подумал, что могу использовать scope: { onNext: '&onNext' }, чтобы "наследовать" функцию onNext из предыдущей области (которая считается той, которая похожа на "волшебник"). Однако это не то, что кажется угловатым. Кажется, что нужно отобразить внутреннюю область действия onNext через атрибут, называемый on-next, тем самым нарушая инкапсуляцию, потому что теперь элементы UI должны ссылаться на функции в родительской области - именно этого я и хотел избежать.

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

Спасибо за ваше терпение.

  • 0
    Вам все еще нужно передать в функцию родительских контроллеров что-то вроде: on-next = "onNext" и в директиве вызвать ее как scope.onNext () (аргумент);
  • 0
    @vodich разве нет чистого способа избежать этого? Я хочу связать интерфейсы контроллеров друг с другом, а не контроллеры с элементами пользовательского интерфейса, по крайней мере, в общем определении мастера.
Показать ещё 4 комментария
Теги:
angularjs-directive

1 ответ

1

scope: { onNext: '&onNext' } не будет наследовать, вам нужно будет определить onNext в шаблоне (область шаблона) так же, как и со свойством page: <enter-name-page page="1"

Если у вас есть функция onNext определенная в customWizardTag директиве customWizardTag либо в функции link либо в ее контроллере, вам придется поместить ее в контроллер, потому что контроллер может быть передан дочерней директиве. Затем вы сможете передать родительский директивный контроллер в функции ссылок директив somethingPage.

.directive('parentDirective, function() {
    return {
        controller: someControllerThatHasOnNext,
    }
 })

.directive('childDirective', function() {
    return {
        require: '^^parentDirective',
        link: function(scope, element, attrs, theParentDirectivesController){
            theParentDirectivesController.onNext();
        }
    }
})

Если это то, что вы хотели

  • 0
    Спасибо Адам. Я думаю, что это именно то, что я хочу. Итак, 4-й аргумент функции link - это родительский контроллер? Это начинает иметь больше смысла.
  • 0
    Да, вы можете получить больше информации в угловых документах -> директивах -> Создание директив, которые сообщают
Показать ещё 1 комментарий

Ещё вопросы

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