Могу ли я объявить директиву в модуле и использовать ее только в компонентах этого модуля?

Приложение My Angular (v7) состоит из нескольких модулей. У меня есть AppModule, содержащий основные части приложения, и несколько отдельных модулей, которые предоставляют редко используемые части приложения. (Я не пока загружаю эти другие модули лениво, но, вероятно, буду загружать их в будущем).

В одном из этих модулей (назовем его OtherModule) у меня есть как компоненты, так и директивы. Директивы только используются компонентами в OtherModule. Имеет смысл (для меня) сохранить определение этих директив, заключенное в OtherModule.

Однако, когда я пытаюсь использовать один из компонентов из OtherModule, я получаю сообщение об ошибке, если этот компонент использует одну из директив из OtherModule:

Привязка свойств appOther не используется ни одной директивой во встроенном шаблоне. Убедитесь, что имя свойства написано правильно и все директивы перечислены в декларации @ NgModule.declarations

(в этом примере appOther - это директива, определенная в OtherModule).

Вы можете увидеть все это в действии (или нет) в этом StackBlitz.

Я пробовал объявить директиву в AppModule, но (а) я действительно не хочу засорять этот модуль частными деталями того, как работает OtherModule, и (б) затем он жалуется, что директива объявляется дважды.

Что я здесь делаю не так? Это кажется очевидным требованием (и если такое разделение задач невозможно, тогда зачем нам вообще модули?).


person Gary McGill    schedule 15.11.2018    source источник
comment
Похоже, работает с <p appOther> (после удаления *). См. этот stackblitz.   -  person ConnorsFan    schedule 15.11.2018
comment
@ConnorsFan: Мне кажется, что он работает, но на самом деле все, что произошло, - это то, что он больше не распознает атрибут как директиву. Попробуйте изменить имя директивы на spellingMistake, и это не повлияет на ваш stackblitz.   -  person Gary McGill    schedule 15.11.2018
comment
Попробуйте еще раз stackblitz. Я не знаю, что заставило вас подумать, что это не сработало, поскольку исходная директива ничего не сделала.   -  person ConnorsFan    schedule 15.11.2018
comment
@JanRecker: Я не уверен, адресовано это мне или ConnorsFan. Я знаю об этом - и на самом деле я в основном следую совету по созданию структурной директивы здесь: angular.io/guide/, где используется звездочка.   -  person Gary McGill    schedule 15.11.2018
comment
@ConnorsFan: вау. Я рад (и благодарен), что у вас все заработало, хотя я не понимаю, почему. Играя с вашим stackblitz, кажется, что вы можете включить звездочку или нет, а также включить значение или нет , но не оба, что было у меня. Странный. В любом случае, похоже, что это вообще не имеет отношения к модулям, и я предположил, что проблема была именно в этом. Спасибо за вашу помощь.   -  person Gary McGill    schedule 15.11.2018
comment
Ваш исходный синтаксис будет работать для структурной директивы, как показано в этот другой stackblitz (директива показывает элемент, когда входное значение равно false).   -  person ConnorsFan    schedule 15.11.2018
comment
@ConnorsFan: да, и на самом деле настоящая директива является структурной директивой, как и ваш пример. (Поскольку я думал, что проблема связана с макетом модуля, я сделал директиву максимально простой - замаскировав реальную проблему). Как оказалось, мои проблемы заключались просто в том, что я неправильно назвал свою привязку \ @Input (без префикса), и это то, из-за чего Angular был расстроен.   -  person Gary McGill    schedule 15.11.2018


Ответы (1)


взглянув на вашу реализацию, я думаю, что вам нужно удалить de * и = "true" и оставить только селектор app.

Просто так:

<p appOther>

Объявление модуля в порядке, вы правильно объявляете директиву в OtherModule и не экспортируете их, вы также не можете объявить ее в AppModule. Если в другой ситуации вы хотите поделиться этой директивой, вы должны объявить ее в общем модуле, который будет

person Octavio Garbarino    schedule 15.11.2018
comment
Спасибо. Это также то, что предложил ConnorsFan - и на самом деле кажется, что * appOther и appOther = true работают, но нет * appOther = true. В любом случае, главное в том, что это не имеет отношения к модулям, на чем я и был зациклен. - person Gary McGill; 15.11.2018
comment
Отличный @Gary McGill, рад узнать, что теперь он работает, и да, похоже, что один из них работает, но не оба вместе. Но да, главное в том, что я включил второй абзац;) - person Octavio Garbarino; 15.11.2018