Javascript 获得';此.editAction不是函数异常';在角度(4)中作为承诺传递给孙子组件时

Javascript 获得';此.editAction不是函数异常';在角度(4)中作为承诺传递给孙子组件时,javascript,angular,typescript,angular5,Javascript,Angular,Typescript,Angular5,我有一个父组件,它将一个承诺传递给孙子组件 我面临着一些奇怪的问题,当从父对象到子对象调用该方法时,这不是一个函数。 我在承诺的范围内发送函数,这完全是它应该发送的。我用的是角度4 我将事件发射器从Grand Child传递到Child,然后再次将save事件发射器从Child传递到父级。当在子对象上单击edit时,这是@Output事件发射器 当在child中单击此项时,我会触发父级中的一个方法,将父级中的一个方法作为承诺传递给孙子级,该方法应在孙子级中实现/调用 当孩子接收到来自孙子的数据时

我有一个父组件,它将一个承诺传递给孙子组件

我面临着一些奇怪的问题,当从父对象到子对象调用该方法时,这不是一个函数。 我在承诺的范围内发送函数,这完全是它应该发送的。我用的是角度4

我将事件发射器从Grand Child传递到Child,然后再次将save事件发射器从Child传递到父级。当在子对象上单击edit时,这是@Output事件发射器

当在child中单击此项时,我会触发父级中的一个方法,将父级中的一个方法作为承诺传递给孙子级,该方法应在孙子级中实现/调用

当孩子接收到来自孙子的数据时,输入字段被禁用(首先)。但是当我在孙子女中点击编辑时。我通过子对象向父对象发出一个方法。这是由父级执行所有操作(数据操纵)

但当我试图通过promise将数据作为函数发送给grand child时,它表示方法名editAction不是函数(这是一个promise)

这很奇怪,因为我正在从父级传递func(请参见代码底部)

//孙儿TS(代码)
@组成部分({
选择器:'孙子',
templateUrl:“./grand child.component.html”,
})
出口级孙辈{
@输入()
public item:TrackingObj;//这是一个将所有变量都设置为跟踪的接口
@输入()
公共编辑操作:(TrackingObj)=>Promise=(记录)=>Promise.resolve(true);
@输出()
public editClicked:EventEmitter=neweventEmitter();
编辑(){
this.editClicked.emit(this.item);
this.editAction(this.item).then(result=>{
If(result.editMode)
result.editMode=false
其他的
result.editMode=true;
});
}
}
//Grand Child HTML组件
//子组件TS代码
@组成部分({
选择器:“参数值列表”,
templateUrl:“./child.component.html”,
样式URL:['./child.component.scss']
})
导出类参数ValuesListComponent实现OnInit{
@输入()
public editItemData:(TrackingObj)=>Promise=(记录)=>Promise.resolve(true);
@输出()
public editClick:EventEmitter=neweventEmitter();
私人物品:TrackingObj;
editClickInChild(项目:TrackingObj){
此.editClick.emit(项);
}
}
//子HTML组件
//父组件TS代码
@组成部分({
选择器:'父',
templateUrl:“./parent.component.html”
})
导出类父类{
私人物品:TrackingObj;
Private editItemToChild:(TrackingObj)=>Promise=(项目)=>new Promise(resolve=>resolve(true))
editItemClick(形式:AbstractControl):(TrackingObj)=>Promise{
let func=(项:lpipParameterValue)=>{
//如果项有子元素,则执行某些操作
if(项目.子项){
//做点什么
}
返回新承诺(解决=>{
解决(项目);
});
};
返回函数绑定(此);
}
editClickedInParent(项目:TrackingObj){
//在这里做点什么
this.editItemToChild=editItemClick();
}
}
//父Html代码

为什么要将此绑定到箭头函数?而且,你使用承诺的方式很复杂??你能指出我需要改变承诺用法的地方吗??由于我在单击child中的edit按钮后等待承诺到达child,因此如果我在child组件中设置了超时,我可以看到editAction正在工作。有什么我可以改变的吗?这种实现方式很复杂,因为使用
new
直接创建承诺几乎是不合适的,除非您正在修改现有的API。这几乎肯定表明了对承诺的误解
//Grand Child TS (code)
@Component({
selector: 'grand-child',
templateUrl: './grand-child.component.html',
})
export class GrandChild {
@Input()
public item: TrackingObj;//this is an interface where all the variable are set for tracking
@Input()
public editAction: (TrackingObj) => Promise<boolean> = (record) => Promise.resolve(true);
@Output()
public editClicked: EventEmitter<TrackingObj> = new EventEmitter();

edit(){
 this.editClicked.emit(this.item);
this.editAction(this.item).then(result => {
    If(result.editMode)
     result.editMode = false
    Else 
     result.editMode = true;
});
}

}

//Grand Child HTML Component
<div>
<a
 id="btn-edit"
(click)="edit()"
>
<i class="fa fa-pencil"></i>
</a>
</div>

//Child Component TS Code
@Component({
    selector: 'parameter-values-list',
    templateUrl: './child.component.html',
    styleUrls: ['./child.component.scss']
})
export class ParameterValuesListComponent implements OnInit {
@Input()
public editItemData: (TrackingObj) => Promise<boolean> = (record) => Promise.resolve(true);
@Output()
public editClick:  EventEmitter<TrackingObj> = new EventEmitter();
Private item: TrackingObj;

editClickInChild(item: TrackingObj) {
 this.editClick.emit(item);
}
}


//Child HTML Component
<div>
<input
Value=""
[disabled]="item.editMode"
/>
<grand-child [editAction]="editItemData" (editClicked)="editClickInChild(item)"></grand-child>
</div>


//Parent Component TS Code
@Component({
selector: 'parent',
templateUrl: './parent.component.html'
})
Export class Parent {
Private item: TrackingObj;
Private editItemToChild: (TrackingObj) => Promise<boolean> = (item) => new Promise(resolve => resolve(true))

editItemClick(form: AbstractControl): (TrackingObj) => Promise<boolean> {
        let func = (item: LpiParameterValue) => {

//if item has child element do something            
if (item.hasChildren) {
        //do something                
            }

            return new Promise(resolve => {
                resolve(item);
            });
        };

        return func.bind(this);
    }

editClickedInParent(item: TrackingObj) {
//do something here
 this.editItemToChild = editItemClick(); 
}
}


//Parent Html Code
<div>
<child [editItemData]="editItemToChild" (editClick)="editClickedInParent(item)"></child>
</div>