2016-12-11 9 views
1

меня есть компонент «контейнер»Доступ экземпляр компонента из родительского компонента в EmberJS

# components/container-component.js 

import Ember from 'ember'; 
export default Ember.Component.extend({ 
    displayComponent: 'simple-box' 
}); 

Шаблон

# templates/container-component.hbs 

<div> 
    {{component displayComponent}} 
</div> 

Теперь внутри экземпляра «контейнера-компонент». Как я могу получить доступ к вычисленному экземпляру «displayComponent»?

Любые идеи о том, как я могу это сделать?

Когда я использую метод получить я получаю строку идентификацию компоненты

this.get('displayComponent') 
# returns (String) 'simple-box' 
+0

Что вы хотите сделать с этим экземпляром? – ykaragol

+0

Спасибо, не могли бы вы взглянуть на мой комментарий? http://stackoverflow.com/questions/41089339/access-the-instance-of-the-component-from-parent-component-in-emberjs?noredirect1_comment69398007_41089703 –

ответ

4

Существует не встроенный способ извлечения детей компонентов из файла родительского компонента расслоения плотного, насколько я знаю , Если вы действительно этого хотите, обратитесь к моему twiddle, который я вам подготовил.

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

Потому что, на мой взгляд, то, что вы пытаетесь достичь, является явным нарушением многих принципов, на которых основан эмбер. Почему вы хотите напрямую получить дочернее свойство от родителя? Вы можете регистрировать действия дочернего компонента и получать уведомления для различных событий в дочернем компоненте. Зачем вам нужен прямой доступ? Лучше, чтобы компонент работал самостоятельно. При таком подходе вы загрязняете родительский код внутренними соображениями детального компонента. Вы можете запросить дерево DOM через jquery внутри родителя, но получение экземпляра дочернего компонента, созданного для вас инфраструктурой Ember, является признаком того, что вы пытаетесь создать что-то, что не соответствует подходу Ember. Мы можем помочь вам лучше, если вы разместите еще один вопрос (или измените этот вариант), чтобы описать свое намерение. Может быть, кто-то может привести вас к лучшему дизайну. С наилучшими пожеланиями.

+0

Блестящее объяснение. Благодаря! Да, я реализовал его так же, как вы показали. Да, я, кажется, нарушаю принцип. Это означает, что я должен попытаться сделать это по-другому. Поэтому я хочу, чтобы межкомпонентная связь. Это потому, что мне нужен определенный элемент dom, который нужно обновить в родительском компоненте. И может быть наоборот. Не могли бы вы объяснить, что вы сказали «... получать уведомления о различных событиях». Кроме того, я думаю, что иметь «сервис», который может использоваться обоими компонентами. Имеет ли это смысл? –

+0

то, что я пытаюсь сказать, это; дочерний компонент должен уведомлять родительский компонент посредством действий только тогда, когда это необходимо. это обеспечит четкое разделение проблем между ребенком и родителем (клиент должен быть помещен в другой родитель, а родитель должен содержать другие дочерние элементы). Вы можете обратиться к [официальному руководству ember] (https://guides.emberjs.com/v2.10.0/components/triggering-changes-with-actions/) для уведомления родителя об изменениях в ребенке. Я подготовлю два новых вертела, чтобы наглядно продемонстрировать надлежащий способ общения между родителем-ребенком вечером. – alptugd

+0

Что касается обмена услугами; было бы лучше увидеть какой-нибудь код в действии с маленькими кругами. Это должно иметь смысл в тех же случаях, но не в других. Я бы пошел на отправку действий с дочернего элемента и сначала обработал эти действия в родительском. – alptugd