10

Aggiungo un Modular UI angolare dove sto passando l'ambito alla finestra modale per il binding a 2 vie. Ho usato il metodo resolve per passare il valore dell'ambito. Questo funziona in un certo senso quando il valore del modello ng cambia in genitore, riflette all'interno della finestra modale. Tuttavia, se il valore cambia all'interno della finestra modale, non si riflette nel modello gen ng. Ecco il mio codice:Connessione UI modale a 2 vie non funzionante

HTML:

<div ng-app="app"> 
    <div ng-controller="ParentController"> 
     <br /> 
     <input type="text" ng-model="textbox.sample" /> 
     <a class="btn btn-default" ng-click="open(textbox.sample)">Click Me</a> 

     <script type="text/ng-template" id="ModalContent.html"> 
      <input type = "text" ng-model= "ngModel"/> 
     </script> 


     <br />{{ textbox }}   
    </div> 
</div> 

Controller:

var app = angular.module('app', ['ui.bootstrap']); 

app.controller('ParentController', function ($scope, $modal) { 

    $scope.textbox = {}; 

    // MODAL WINDOW 
    $scope.open = function (_ngModel) { // The ngModel is passed from open() function in template 
     var modalInstance = $modal.open({ 
      templateUrl: 'ModalContent.html', 
      controller: ModalInstanceCtrl, 
      resolve: { 
       ngModel: function() { 
        return _ngModel; 
       } 
      } // end resolve 
     }); 
    }; 
}); 

var ModalInstanceCtrl = function ($scope, $modalInstance, ngModel) { 
    $scope.ngModel = ngModel; 

}; 

Perché isint il modo 2 legame tra genitore e l'istanza modali non funziona nel codice sopra?

+1

Dove ci si aspetta effettivamente di vedere l'associazione bidirezionale, dove si stampa '{{textbox}}'? Se questo è il caso, non stai più agendo su '$ scope.textbox' una volta che sei nel modale, stai creando una copia di' $ scope.textbox' quando lo passi come '_ngModel' e poi tu l'oggetto modal '$ scope' è' $ scope.ngModel' ...Prova a stampare '{{ngModel}}' sul genitore e vedi cosa succede – Tom

+0

È meglio passare $ scope come parametro di opzione in modali aprire la funzione – Armen

+0

@Tom Quando ho detto il binding a 2 vie, cosa intendevo dire che voglio il testo casella di input nella finestra principale e modale per modificare se uno qualsiasi di questi valori cambia. Per esempio, nel mio esempio, il modello -g per 'input' in parent e' input' in modal window è lo stesso. Quindi quando digito qualcosa in genitore 'input' e poi apro il modal, posso vedere il modale' input' che ha lo stesso valore. Ma quando digito qualcosa all'interno di 'input' dell'istanza modale, non lo aggiorna sull'input genitore. Quando quei 2 sono legati dallo stesso modello-ng, non dovrebbero aggiornarlo? – Neel

risposta

6

penso che tu sia sotto l'impressione che ng-model="textbox.sample" nel genitore e nel ng-model="ngModel" modale sono le stesse, perché si sta passando textbox.sample al modale e tu sei in grado di vedere il valore corretto nella finestra modale . L'unica ragione per cui questo funziona è che si imposta esplicitamente la proprietà $scope.ngModel ogni volta che si apre la finestra modale.

Un modo per rendere questo lavoro come ci si aspetta è utilizzare la proprietà $scope.textbox.sample in entrambi i posti, ma non la consiglierei.

Forse il modo corretto sarebbe quello di utilizzare il modalInstance.result promessa, qualcosa di simile:

Creare un pulsante sul modale e fanno è ng-click="ok()"

$scope.ok = function() { 
    $modalInstance.close($scope.ngModal); // will return this to the modalInstance.result 
} 

E poi nel controller genitore, o qualsiasi altra cosa apre la finestra modale:

$scope.open = function (_ngModel) { // The ngModel is passed from open() function in template 
    var modalInstance = $modal.open({ 
     templateUrl: 'ModalContent.html', 
     controller: ModalInstanceCtrl, 
     resolve: { 
      ngModel: function() { 
       return _ngModel; 
      } 
     } // end resolve 
    }); 

    modalInstance.result.then(function (result) { 
     $scope.textbox.sample = result; 
    }); 
}; 
+0

Hai ragione. Ho completamente frainteso poiché pensavo che il passaggio del modello ng attraverso open() avrebbe dato lo stesso ambito modale al modale e vincolerebbe automaticamente entrambi i modelli. Le tue risposte lo cancellano per me. Adoro il tuo suggerimento di utilizzare la promessa 'modalInstance.result' per aggiornare il modello ng del genitore e sincronizzarlo con l'istanza modale. Ha un senso totale! Darò una prova sul mio codice e riferirò. – Neel

+0

Scusa se torno di nuovo. Nel mio codice sto trasmettendo il modello ng aggiornato tramite '$ modalInstance.close'. Tuttavia, sto avendo un po 'di problemi nell'aggiungere l'ultimo codice nel controller genitore che elabora la promessa. Quando ho aggiunto quel codice, ricevo l'errore 'modalInstance is not defined'. Penso di posizionare questo codice in una posizione sbagliata all'interno del mio controller genitore. Questo va all'interno della funzione '$ scope.open' o all'esterno? Devo aggiungere anche il comando '$ modalInstance' nel controller principale? Scusa se questa è una domanda stupida. – Neel

+1

Sì, avrete bisogno di fare il 'modalInstance.result' nello stesso blocco che definite' modalInstance', cioè, var modalInstance = $ modal.open ({...}); modalInstance.result.then (...) ' – Tom

10

Cambio:

<input type = "text" ng-model= "ngModel"/> 

Into:

<input type = "text" ng-model= "$parent.ngModel"/> 

Questo ha a che fare con inclusione. Controllare: https://github.com/angular-ui/bootstrap/issues/969

+2

hai salvato la mia giornata! – greener

+0

Grazie! Sono contento di averlo fatto! :) –

1

Per me nessuna delle precedenti ha funzionato.

Invece ho dovuto fare come è stato suggerito in this comment in github.

La variabile da associare a deve essere un oggetto, non solo un valore semplice.

Ad esempio, se $scope.value non funziona, funzionerà se si utilizza $scope.someObject.value.