2016-08-24 4 views
1

В Angular2 это можно инжектировать родитель или даже предок (например, бабушка и дедушка.) Компоненту к ребенку, просто используя следующий синтаксис:Как придать косвенный компонент предка в Angular2

export class Grandchild { 
    constructor(@Optional() @Host() @Inject(forwardRef(() => Ancestor)) ancestor) 
} 

однако, что кажется, работает только для предок-внучатые отношений, которые определены в одном шаблоне, как следующее:

<!-- App component template --> 
<ancestor> 
    <foobar> 
    <grandchild></grandchild> <!-- injection works --> 
    </foobar> 
</ancestor> 

Если вместо этого наши шаблоны будет походить следующим образом, инъекция не будет работать:

<!-- App component template --> 
<ancestor> 
    <foobar></foobar> 
</ancestor> 

<!-- Foobar component template --> 
<grandchild></grandchild> <!-- injection doesn't work --> 

Я сделал plunker для этого: http://plnkr.co/edit/D9iSokONIAFAS8G1NTd1

+1

Я не думаю, что это поддерживается. –

+0

Надеюсь, это не так, но если так, то я думаю, что я должен отправить отчет об ошибке в Angular2. –

+1

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

ответ

1

Вы можете обеспечить общую службу и использовать его для общения.

@Injectable() 
class SharedService { 
    grandParent = new BehaviorSubject(); 
} 

@Component({ 
    selector: 'grand-parent', 
    providers: [SharedService], 
    ... 
}) 
class GrandParent { 
    constructor(sharedService:SharedService) { 
    sharedService.grandParent.next(this); 
    } 
} 

@Component({ 
    selector: 'descendant', 
    providers: [], 
    ... 
}) 
class Descendant { 
    constructor(@Optional() sharedService:SharedService) { 
    if(sharedService) { 
     sharedService.grandParent.subscribe(grandParent => this.grandParent = grandParent); 
    } 
    } 
} 

На практике я бы не отправить ссылку на this, но использование наблюдаемых для отправки сообщений приемника действует на.

+0

Хороший ответ. Отсутствующую функциональность «@Optional» может быть достигнута с помощью поставщика фиктивного прикладного уровня для этого «SharedService», только разница в том, что ссылка на «Grandparent» не определена. Моим специальным вариантом использования является создание пользовательских встроенных полей редактирования, которые могут действовать независимо (встроенное редактирование) или как часть пользовательской формы (традиционное редактирование). Я думаю, что в этом конкретном случае я буду использовать прямую ссылку от входных (дочерних) компонентов к необязательной форме (предка), а не наблюдаемых в этом случае, хотя наблюдаемые обычно являются рекомендуемым решением. –

+0

Не уверен, что вы подразумеваете под «отсутствующей функцией @Optional». Это можно использовать и с услугами. –

+0

Я имел в виду, что вам нужно всегда иметь поставщика услуг. И если вы используете «ребенка» без «предка» (таким образом, предок является необязательным), вам необходимо предоставить эту общую службу на уровне приложения, чтобы предотвратить сбой Angular2. Если вы думаете об эквиваленте HTML для этого, то можете использовать элементы без элемента

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

0

Кит Ричардс мог бы рассказать вам кое-что о глотания предков ...

https://www.youtube.com/watch?v=uo5dtPx7P8g

К сожалению, дешевые шутки, но должен был сделать это.

Смежные вопросы