Я думаю, что я хочу сделать, это полностью изолировать каждый шаг мастера в директиве пользовательских элементов.
Я думаю, что это позволит мне полностью инкапсулировать детали каждой страницы мастера. Например:
<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 должны ссылаться на функции в родительской области - именно этого я и хотел избежать.
Я лаяю неправильное дерево, или есть идиоматический способ сделать это. День веб-поиска не заставил меня далеко, но я могу использовать неправильные условия поиска.
Спасибо за ваше терпение.
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();
}
}
})
Если это то, что вы хотели