【问题标题】:Angular 2 Unexpected directive value 'undefined'Angular 2意外的指令值'未定义'
【发布时间】:2016-08-05 16:11:35
【问题描述】:

我有 2 个组件,我想在另一个中重复使用一个,所以这是我要重复使用 ExpressionBuilderComponent 的组件:

@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,它应该显示 Test 两次,因为我使用了两次 &lt;expression-builder&gt;

在我的项目中它显示为一个空元素,在这个屏幕截图中你可以看到它是如何呈现出来的:

有人可以帮我解决这个问题,在这种情况下它怎么可能起作用?

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

【问题讨论】:

  • 首先你需要通过写directives: [ExpressionBuilderComponent]来引用ExpressionBuilderComponent。在那之后,如果你想再次引用它,你应该在组件树的下方写directives: [forwardRef(() =&gt; ExpressionBuilderComponent)]。你试过了吗?
  • 使用plnkr.co/edit/nW00uu?p=info作为模板开始。
  • Plunker 似乎又开始工作了。
  • @GünterZöchbauer 你能帮帮我吗?我收到了这个错误,不知道他为什么会失败? Error during instantiation of Token Promise&lt;ComponentRef&gt;!.plnkr.co/edit/ZqNXjd?p=preview
  • 如果没有其他办法,那么这最有效的办法;-)

标签: typescript angular components


【解决方案1】:

如果您从指令中删除 ExpressionBuilderComponent,错误就会消失:

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

如果有必要,我不知道解决方案。 TypeScript 中的类之间的 AFAIK 循环依赖只能使用接口来解决,我不知道这将如何与 directives 一起使用。

Plunker example

顺便说一句:这就是你的 Plunker 的样子。允许重现问题的最小示例。您添加了许多与问题完全无关的代码。

【讨论】:

  • 对不起,我认为您可以对此有更好的了解,这样我就不会忘记提及一些事情
  • 很难阅读和理解您不知道其用途的代码,并找出其中哪些代码实际上可能与问题相关。如果您报告问题,请尽量删除尽可能多的代码,同时保持实际问题的可重现性。您将在更短的时间内获得更好的响应。
  • 好的,谢谢你的提示,我以后会记住这一点的 :) 所以你现在不知道这个问题的任何解决方案吗?
  • ExpressionComponent 中从directives 中删除ExpressionBuilderComponent 怎么样?我不明白你为什么需要它。
  • 好的,但是它的组件选择器又是空的并且没有显示我想要的模板。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 2017-12-19
  • 2016-07-22
  • 2018-05-17
  • 2016-12-25
  • 2018-07-12
相关资源
最近更新 更多