2017-06-14 1 views
1

J'ai le problème suivant.Résolution de la promesse angulaire 2

En fonction j'ai une promesse comme un type de retour. Cette fonction est dans la classe Hiérarchie.

updateNodeValues(entity: String, data: {}): Promise<any>{ 
    let jsonBody = JSON.stringify(data); 
    let url = environment.endpointCore + '/api/' + entity + '/' + data['id']; 

    return this.http.put(url, jsonBody, this.options) 
     .toPromise() 
     .then(response => { 
     return response; 
     }) 
     .catch(this.handleError); 
    } 

Cette fonction est dans le nœud de classe.

onSubmit(): void{ 
    var currentForm = this.form.value; 
    var entityName = this.inflection.classify(this.node.type).toLowerCase(); 
    var requiredData = {}; 

    for(var i = 0; i < this.formItems.length; i++){ 
     this.formItems[i].value = currentForm[Object.keys(currentForm)[i]]; 
    } 

    for(var i=0; i<this.formItems.length; i++){ 
     requiredData[this.globalService.camelize(this.formItems[i].label)] = this.formItems[i].value 
    } 

    Promise.resolve(this.hierarchyService.updateNodeValues(entityName, requiredData)).then(response => { 
     alert(response.ok); 
     if(response.ok){ 
     this.globalService.showSuccessMessage('Values updated'); 
     this.refreshGui(requiredData); 
     } 
    }); 
    this.editMode = false; 
    } 

Le problème est que lorsque je tente de résoudre la promesse et invoquer this.refreshGui(requireddata) rien ne se passe. J'ai lu comment la grosse flèche préserve le 'contexte' de ceci, et je ne comprends pas pourquoi l'invocation de cette méthode ne fait rien, tandis que l'invocation successMessage produit le résultat attendu.

La méthode que j'invoque ressemble à ceci, et il est également dans le nœud de classe.

private refreshGui(data: {}){ 
    this._node.data = data; 
    this.objectProperties = new Array(); 
    this.nodeChildren = new Array(); 
    for (var property in data) { 
     var propertyValue = data[property]; 
     if (propertyValue instanceof Array) { 
     this.nodeChildren.push({label: property, value: "total: ".concat(propertyValue.length.toString())}); 
     } else { 
     this.objectProperties.push({label: property, value: propertyValue}); 
     } 
    } 
    } 

Répondre

0

La solution que je trouvais à travailler était de mettre en œuvre des événements personnalisés. Le problème était que dans la résolution de rappel asynchrone, le contexte de ce qui est this serait "se perdre". La grosse flèche m'a permis d'invoquer la méthode de classe avec ceci, mais les propriétés dans le sont "perdues". Pour cette raison, j'ai pris la logique de la méthode, et l'ai mise dans la partie callback et ai mis les résultats attendus et nécessaires dans une certaine variable. Cette variable a été transmise à mon événement personnalisé et définie comme variable de classe dans le gestionnaire d'événements personnalisé.