angular2 在不确定父组件的情况下,子组件怎么调用父组件的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了angular2 在不确定父组件的情况下,子组件怎么调用父组件的方法相关的知识,希望对你有一定的参考价值。

参考技术A 1、页面中首先引入相关 js
<script src="js/react.js"></script>
<script src="js/react-dom.js"></script>
<script src="js/browser.min.js"></script>
<script src="js/jquery.min.js"></script>

2、此例子中:table组件为父组件,弹层组件为子组件
3、html代码
<div id="showHide"></div>
4、js代码

//列表组件
var PopShow = React.createClass(
getInitialState: function()
return
hideParent: false,
id:null
;
,

deleteClick:function(data)
console.log(this.state.hideParent);
this.setState(
hideParent:!this.state.hideParent,
id:data
);
,
cancelClick:function()
this.setState(
hideParent: !this.state.hideParent
);
,
sureClick:function()
this.setState(
hideParent: !this.state.hideParent
);
console.log(this.state.id);
//也可进行异步方法调用
,
render:function ()
return(
<div>
<table className="tab"><thead><tr><td>序号</td><td>名称</td><td>操作</td></tr></thead><tbody>
<tr><td>1</td><td>海南大学</td><td> <button onClick=this.deleteClick.bind(this,"11")>删除</button></td></tr>
</tbody></table>
this.state.hideParent ?<PopAlert callbackParentSure=this.sureClick callbackParentCancel=this.cancelClick/>:null
</div>

);

);

ReactDOM.render(
<PopShow />,
document.getElementById('showHide')
);

//弹层组件
var PopAlert = React.createClass(
childCancel:function()
this.props.callbackParentCancel();
,
childSure:function()
this.props.callbackParentSure();
,
render: function()
return <div className="pop"><div><h4>确定删除?</h4>
<button onClick=this.childCancel>取消</button><button onClick=this.childSure>确定</button>
</div></div>

);
5、页面效果

如何在不使用服务的情况下将子组件之间的反应式表单数据传递给父组件

【中文标题】如何在不使用服务的情况下将子组件之间的反应式表单数据传递给父组件【英文标题】:How to pass reactive form data between child to parent components with out using services 【发布时间】:2019-05-25 14:13:54 【问题描述】:

当我们点击父按钮时,我们希望使用父级的子响应式表单数据。目前我们正在使用 viewchild 来获取子组件引用。我们正在获取所有静态数据,但不是表单填充数据...................................................... ..................................................... ......

parent.component.ts
@ViewChild(DetailsComponent) childrenComponent: childrenComponent;

save()
let model=this.childrenComponent.buildDetailsModel();
/*here api to save model*/

children.component.ts
buildDetailsModel(): Details 
var a = 
  reportedToId: this.detailsForm.get('reportedTo').value,
  reportedOn: this.detailsForm.get('reportedTime').value,
  identifiedById: this.detailsForm.get('identifiedBy').value,
  identifiedOn: this.detailsForm.get('dateAndTimeIdentified').value,
  locationTypeId: this.detailsForm.get('locationType').value,
  addressId: this.detailsForm.get('locationAddress').value,
  AddressLine: this.detailsForm.get('locationOfAddress').value,
  description: this.detailsForm.get('description').value,
  PeopleExposed: this.dataSource
  ;
  return a;


parent.html 
<child></child>

child.html
<form [formGroup]="detailsForm">
  <div fxLayout="column wrap" fxLayoutGap="12px">

    <div fxLayout="column" fxLayout.lt-sm="column" fxLayout.lt-md="column" 
   fxLayoutGap="24px">

      <div fxFlex="row" fxLayoutGap="24px" fxLayout.lt-md="column">
        <div fxFlex="column">
          <mat-form-field>
            <mat-label>Reported To</mat-label>
            <mat-select matInput formControlName="reportedTo">
              <mat-option value="Test 1">Test 1</mat-option>
              <mat-option value="Test 2">Test 1</mat-option>
            </mat-select>
          </mat-form-field>


          <mat-form-field>
            <input matInput [matDatepicker]="reportedTime" placeholder="Date 
          and time reported" date="true" time="true" 
          formControlName="reportedTime">
            <mat-datepicker-toggle matSuffix [for]="reportedTime"></mat- 
           datepicker-toggle>
            <mat-datepicker #reportedTime></mat-datepicker>
          </mat-form-field>

          <mat-form-field>
            <mat-label>Identified by</mat-label>
            <mat-select matInput formControlName="identifiedBy">
              <mat-option value="Test 1">Test 1</mat-option>
              <mat-option value="Test 2">Test 1</mat-option>
            </mat-select>
          </mat-form-field>
        </div>

【问题讨论】:

你也可以分享你的html代码吗? 你能检查一次吗 【参考方案1】:

将您的子表单包裹在表单元素中,以便您可以从父表单提交您的子表单,然后在子组件中注入 FormGroupDirective 以获取父表单的引用

<form (ngSubmit)="save()" [formGroup]="detailsForm"> 
    <app-child></app-child>
    <button type="button">Save</button>
 </form>

然后使用controlContainer在子组件中提供已有的FormGroupDirective

childcomponent.ts

  form;
  constructor(private fb: FormBuilder, @Host() private parentFor: FormGroupDirective)  

  ngOnInit() 
    this.form = this.parentFor.form;
    //Add FormControl as per your need
    this.form.addControl('child', this.fb.group(
      name: "",
      email: ""
    ))

  

child.component.html

<form formGroupName="child">
  <input formControlName="name">
  <input formControlName="email">
</form>

例如:https://stackblitz.com/edit/angular-xusdev

【讨论】:

这是有效的。但是我怎样才能获得其他属性(除了表单字段)?由于我们在子组件中也使用了响应式表单字段和模板驱动的表单字段。【参考方案2】:

如果使用“referenceVariable”,您可以访问“child”的所有公共变量和函数

<button (click)="click(mychild)"></button>
<child #mychild></child>

click(mychild.any)

   console.log(mychild.detailsForm);

无论如何,我认为您想要一个属于表单的孩子。为此,您可以在孩子中使用 viewProviders

viewProviders: [
    
      provide: ControlContainer,
      useExisting: FormGroupDirective
    
  ]

如link 所示

【讨论】:

以上是关于angular2 在不确定父组件的情况下,子组件怎么调用父组件的方法的主要内容,如果未能解决你的问题,请参考以下文章

子组件如何在不监听生命周期方法的情况下从父组件接收 props?

在不使用发射的情况下跟踪父级中的子组件值?

如何在不使用服务的情况下将子组件之间的反应式表单数据传递给父组件

如何在不使用角度的ng的情况下将输入值从父组件传递给子组件?

VueJS 在不更改父数据的情况下编辑道具的正确方法

具有多个子组件实例的Angular2父组件