【问题标题】:`Error: Output is not defined` when passing value outside a directive to parent directive将指令外部的值传递给父指令时出现“错误:未定义输出”
【发布时间】:2016-01-15 09:37:27
【问题描述】:

我有一个根应用程序组件,它在模板中这样定义。

template: `
<dev-table (complete)="onSelect(developer)"></dev-table>
<dev-details [selectedDeveloper]="selectedDeveloper"></dev-details>
`
directives: [DevDetailsComponent, DevTableComponent],
providers: [DevValueService, provide(DevService, {useClass: DevService})]

是一个列表,在选择其中一个内部列表时,它应该发送列表(开发者)的值,该列表作为选定的开发者传入。 @Input 定义正确并被正确考虑。但是@output 给出了错误Error: Output is not defined 需要什么定义或定义方法是什么。我错过了一些东西。

这是类定义:

@Component({
  selector: 'dev-table',
  template: `
    <ul class="dev">
      <li *ngFor="#developer of developers"
        [class.selected]="developer === selectedDeveloper;this.complete.next();"
        (click)="onSelect(developer)">
        <span class="spanbackground">{{developer.name}}</span> -  {{developer.skill}}
      </li>
    </ul>  
  `, 
  providers: [DevService]
})

export class DevTableComponent implements OnInit{
    public developers : Developer[];
    public selectedDeveloper : Developer;
    constructor(private _DevService: DevService) { }
    @Output() complete = new EventEmitter(); 
    public onSelect(developer: Developer) { this.selectedDeveloper = developer; }
    getDevelopers(){
      this._DevService.getDevelopers().then(developers => this.developers = developers)
    }
    ngOnInit(){
      this.getDevelopers();
    }
}

更新:最终的工作代码没有developer === selectedDeveloper;this.complete.next();,而是将this.complete.next() 放入onSelect 函数中。

【问题讨论】:

  • 这个是你加的吗? import {Output} from "angular2/core";
  • 谢谢。我做到了,得到了 Binding expression cannot contain chained expression at column 33 in [developer === selectedDeveloper;this.complete.next();] in DevTableComponent@3:8 。我在技术上所做的是将开发人员的价值传递给父组件。然后将其作为输入传递给 .dev-details 工作正常,隔离。但无法捕获带值发送的事件。
  • 你不能在模板中添加那么多代码,你必须将所有逻辑添加到一个返回布尔值的函数中,并像这样调用它:[class.selected]="shouldSelect()"
  • 是的。您使用的任何类都必须导入它。 OnInit、开发人员、DevService ...
  • 试试onSelect($event) ?

标签: events output angular


【解决方案1】:

“@output 给出错误错误:未定义输出需要什么定义或定义方法是什么。我遗漏了一些东西。” :

import {Output} from "angular2/core";

您必须导入您正在使用的任何类的定义。

【讨论】:

  • 一切正常,代码正在运行。我已经在子指令中定义了事件。单击时捕获数据(console.log 工作正常)。我能够从指令中正确传递事件 - 没有产生错误。使用this.complete.emit(someValue);,但我无法在父组件&lt;dev-table (complete)="onSelect($event.value)"&gt;&lt;/dev-table&gt; 中捕获事件,它在父组件中给出了未定义的$event.value。是否有不同的捕获过程?
  • 只是$event 而不是$event.value
  • console.log 未定义。
  • 您可能希望将代码更新为现在的样子
【解决方案2】:

如果您想将值传递给父组件,您可以利用自定义事件。这段代码位于父组件的模板中:

@Component({
  (...)
  template: `
    <dev-table (complete)="someMethod($event.value)"></dev-table>
  `
})
export class ParentComponent {
  someMethod(value) {
    console.log('complete event - value = ' + value);
  }
}

要触发事件,您可以在子组件中执行类似的操作:

@Component({
  (...)
  template: `
    (...)
    <span (click)="triggerCompleteEvent()">Trigger complete event</span>
  `
})
export class DevTableComponent implements OnInit{
  @Output()
  complete:EventEmitter;

  constructor() {
    this.complete = new EventEmitter();
  }

  triggerCompleteEvent() {
    this.complete.emit(someValue);
  }
}

someValue 对应于您希望事件包含并且事件订阅者可以获得的值。

希望对你有帮助 蒂埃里

【讨论】:

  • 这个函数是否完整应该在父指令或实际指令中。 $event.value 是我的指令列表中的一些值。
  • 值被捕获并且事件被正确触发。但是父母是不确​​定的。 &lt;ul class="dev"&gt;&lt;li *ngFor="#developer of developers" [class.selected]="developer !== selectedDeveloper" (click)="onSelect(developer)"&gt;&lt;span class="spanbackground"&gt;{{developer.name}}&lt;/span&gt; - {{developer.skill}} &lt;/li&gt;&lt;/ul&gt; 和班级有 onSelect(developer: Developer) { this.selectedDeveloper = developer;console.log(this.selectedDeveloper);this.complete.emit(this.selectedDeveloper); } 。在父 &lt;dev-table (complete)="onSelect($event.value)"&gt;&lt;/dev-table&gt;
  • 现在安全地传递数据。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2015-12-25
  • 2015-10-27
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
相关资源
最近更新 更多