2016-04-14 7 views
1

У меня есть 2 компонента, я хочу, чтобы повторно использовать один в другом, так что это компонент, я хочу, чтобы повторно использовать ExpressionBuilderComponent:Угловое 2 Неожиданное значение директивы «не определено»

@Component({ 
    selector: 'expression-builder', 
    template: ` 
     <div class="container"> 
      <expression *ngFor="#expression of expressions" [prototypes]="prototypes" [expression]="expression" [expressions]="expressions"></expression> 
      <a class="btn btn-primary" (click)="addExpression()"><i class="glyphicon glyphicon-plus"></i></a> 
     </div> 
    `, 
    directives: [ExpressionComponent] 
}) 

чем у меня ExpressionComponent так:

@Component({ 
    selector: 'expression', 
    template: ` 
    <div class="row"> 
    <!-- First Select --> 
     <div class="col-xs-3"> 
      <select class="form-control" [(ngModel)]="selectedPrototypeSelector" (ngModelChange)="onPrototypeChange()"> 
       <option *ngFor="#p of prototypes" [value]="p.selector"> 
        {{ p.selectorName }} 
       </option> 
      </select> 
     </div> 

<!-- Expression Set selector --> 
    <div *ngIf="prototype?.valueType === 'Set'"> 
     <expression-builder></expression-builder> 
    </div> 

Вот PLUNKR и он должен показать тест два раза, потому что я использую <expression-builder> дважды.

В моем проекте он показывает как пустой элемент, На этом скриншоте вы можете увидеть, как он вынес из: enter image description here

Может кто-то пожалуйста, помогите мне в этом, как это возможно, что в этом случае работает?

http://www.syntaxsuccess.com/viewarticle/recursive-treeview-in-angular-2.0

+0

Для начала вам нужно обратиться к 'ExpressionBuilderComponent', написав' директивы: [ExpressionBuilderComponent] '. После этого, далее в дереве компонентов вы должны написать 'директивы: [forwardRef (() => ExpressionBuilderComponent)]', если вы хотите снова ссылаться на него. Вы попробовали это? – user707727

+0

Используйте https://plnkr.co/edit/nW00uu?p=info как шаблон для начала. –

+0

Plunker, похоже, снова работает. –

ответ

0

Если удалить ExpressionBuilderComponent из директив ошибка уходит:

@Component({ 
    selector: 'expression', 
    ... 
    // directives: [ExpressionBuilderComponent] 
}) 
export class ExpressionComponent implements OnInit { 

, если это необходимо, я не знаю решения. Круговые зависимости AFAIK между классами в TypeScript можно разрешать только с помощью интерфейсов, и я не знаю, как это работает с directives.

Plunker example

BTW: это как ваша Plunker должна была выглядеть. Минимальный пример, который позволяет воспроизвести проблему. Вы добавили много кода, который полностью не связан с проблемой.

+0

Извините, человек, я думал, что вы могли бы получить лучший обзор, чтобы я не забыл что-то упомянуть. – Sreinieren

+0

Это очень трудно прочитать и понять код, который вы не знаете цели, и найти, какой из этого кода может быть действительно связан к проблеме. Если вы сообщаете о проблеме, старайтесь избавиться от как можно большего количества кода, сохраняя при этом актуальную проблему воспроизводимой. Вы получите гораздо лучший ответ в более короткое время. –

+0

Хорошо, спасибо за отзыв. Я буду помнить об этом в будущем :) Значит, вы не знаете решения для этой проблемы прямо сейчас? – Sreinieren