2

我正在尝试通过@Input 传递自定义对象。但是,我得到null作为输出。

这是我的子组件类:

import { Component, OnInit, Input } from '@angular/core';
import { Element } from '../app.element';

@Component({
  selector: 'app-server-element',
  templateUrl: './server-element.component.html',
  styleUrls: ['./server-element.component.css']
})
export class ServerElementComponent implements OnInit {
//  @Input('srvElement') element: {type: string, name: string, content: string};    <--- This works

  @Input('srvElement') ele:Element;   <--- This doesn't work

  constructor() { }

  ngOnInit() { }

}        

这是我的element课:

export class Element{
  type: string;
  name: string;
  content: string;
  constructor(type: string="", name: string="", content: string=""){
    this.type = type;
    this.name = name;
    this.content = content;
  }
}           

在父类的 htmlapp.component.html中,我有这个(与子类通信):

<div class="container">
  <app-cockpit (notify)="onNotifyClicked($event)"></app-cockpit>
  <hr>
  <div class="row">
    <div class="col-xs-12">
      <app-server-element *ngFor="let serverElement of serverElements"
      [srvElement]="serverElement"></app-server-element>
    </div>
  </div>
</div>

父类即app.component.ts

import { Component } from '@angular/core';
import { Element } from './app.element';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  serverElements = [{type: 'server', name: 'Testserver', content: 'Just a test'}];
  element: {type: string, name: string, content: string};

  onNotifyClicked(e: Element){
    if(e.type==='server'){
        this.serverElements.push({
        type: 'server',
        name: e.name,
        content: e.content
      });
    } else {
        this.serverElements.push({
        type: 'blueprint',
        name: e.name,
        content: e.content
      });
    }
  }
}  

任何人都可以向我解释为什么@Input('srvElement') ele:Element; 工作也不 @Input('srvElement') let ele=new Element();行(传递我自己的自定义对象)但@Input('srvElement') element: {type: string, name: string, content: string};工作正常

4

4 回答 4

1

我刚刚发现执行这两个选项中的任何一个都有效:

  • @Input('srvElement') element=new Element();
  • @Input('srvElement') element:Element;

注意:对象的名称必须element子类的 html 中使用的名称相同,即server-element.component.html.

于 2017-08-31T14:10:46.247 回答
0

我有一个示例,我将输入定义为:

import {Element} from 'placeWhereThisIs';
...

@Input() srvElement: Element;
于 2017-08-31T13:45:53.180 回答
0

您需要将循环的父元素,而子元素是您的子组件。

<div *ngFor="let serverElement of serverElements">
  <app-server-element 
       [srvElement]="serverElement"></app-server-element>  
</div>

检查子组件中的以下行

ngOnChanges() {
   console.log(this.ele);
 }

它应该工作。

您在 onNotifyClicked 事件中编写的哪个代码将该代码放入 ngOnChanges。

因为您的父组件的 for 循环在加载子组件后进行迭代,您需要通知子组件输入参数发生更改,这就是您需要 ngOnChanges 事件的原因。

于 2017-08-31T13:50:47.170 回答
0

我想这可能是因为Element类型定义也属于 HTML 元素。但我试过这个plunker并且工作得很好。您应该在更改Element班级名称后尝试。这是 Plunker https://plnkr.co/edit/RSPoEEub1mtr2BC4sqxQ?p=preview

于 2017-08-31T14:14:02.260 回答