2017-08-25 5 views
0

Je mon composant je passe un objet comme une liaison,Traiter avec les fixations ne sont pas prêts à Angluarjs

.component('selectionButton', { 
    bindings: { 
     parentForm : '<' 
    }, 
    templateUrl: 'selection-button-component.html', 
    controller: 'selectionButtonController', 
    controllerAs: 'selBtnCtrl' 
}); 

Le problème est que l'objet je passe n'est pas encore chargé lorsque mon composant est initialisé, donc dans le crochet onChanges $ Je l'ai fait:

vm.$onChanges = function(newObj){ 
    if(angular.isDefined(newObj.parentForm.currentValue)){ 
     vm.parentForm = newObj.parentForm.currentValue; 
    } 
}; 

dans mon contrôleur j'appelle vm.parentForm dans une fonction, que je déclencheur lorsque je clique sur un bouton après ma page est complètement chargée, mais je reçois toujours comme undefined , même quand j'ai changé sa valeur en utilisant $onChanges . Lorsque j'ai inspecté la fonction vm.$onChanges, je peux voir que la valeur vm.parentForm obtient la nouvelle valeur changesObj.parentForm.

Comment puis-je résoudre ce problème?

Edit:

J'ai essayé d'envelopper mon élément avec un ng-if comme suit:

<span ng-if="fullPage.posteForm"> 
      <selection-button parent-form="fullPage.posteForm" ></selection-button> 
     </span> 

mais cela ne fonctionne pas. J'ai aussi essayé la liaison bidirectionnelle qui ne marchait pas aussi bien.

+0

deux solutions possibles. 1. changez les liaisons en =. 2. avoir un ng-if = "vm.parentForm" pour envelopper le html et ainsi une fois qu'il est initialisé, le html recompilera. –

+0

Vous n'avez pas besoin de ng-if pour résoudre ceci: utilisez onChanges dans votre composant enfant de sorte que chaque fois que votre valeur sera mise à jour, hook onChanges sera déclenché dans le composant enfant et vous pourrez assigner la nouvelle valeur d'objet. '' '' onChanges() = fonction (changements) { if (changes.parentForm.currentValue! == undefined) { this.parentForm = changes.parentForm.currentValue; } '' '' – rbinsztock

+1

Vous n'avez en fait pas besoin de mettre à jour la portée locale du composant car elle se met automatiquement à jour lors de toute modification de liaison. – Korte

Répondre

1

Lorsque vous transmettez un objet à un composant, il se peut qu'il ne soit pas prêt car vous attendez la résolution d'une promesse ou d'une autre action, mais la définition de l'objet est indéfinie. Pour ce type d'escenario, vous pouvez utiliser isFirstChange(). Voici un exemple de travail qui illustre un tel cas JSFiddle example. Ouvrez votre console pour voir quand vos liaisons sont mises à jour après le délai. Remarque: si le nom d'objet utilisé dans le modèle du composant est égal à celui qui a été transmis au composant, vous n'avez pas besoin de créer un nouvel objet. Il sera mis à jour dans votre composant et disponible dans le modèle.