10

Ich füge ein Angular UI Modal hinzu, wo ich den Scope durch das Modal Window für 2-Wege-Bindung führe. Ich habe die Methode resolve verwendet, um den Wert des Bereichs zu übergeben. Dies funktioniert, wenn der ng-Modellwert sich im Parent ändert und im modalen Fenster reflektiert wird. Wenn sich der Wert jedoch innerhalb des modalen Fensters ändert, spiegelt er sich nicht im übergeordneten ng-Modell wider. Hier ist mein Code:Angular UI Modale 2-Wege-Bindung funktioniert nicht

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; 

}; 

Warum iSINT die 2-Wege-Bindung zwischen Eltern und modal Instanz nicht in dem obigen Code zu arbeiten?

+1

Wo erwartest du eigentlich, dass die Zwei-Wege-Bindung passiert, wo du '{{textbox}} '' druckst? Wenn das der Fall ist, handeln Sie nicht mehr in '$ scope.textbox', sobald Sie im modalen Modus sind, erstellen Sie eine Kopie von' $ scope.textbox', wenn Sie sie als '_ngModel' und dann Sie übergeben modal $ scope ist $ scope.ngModelVersuchen Sie, '{{ngModel}}' auf dem Elternteil zu drucken und sehen Sie, was passiert – Tom

+0

Es ist besser $ scope als Optionsparameter in modals zu übergeben open Funktion – Armen

+0

@Tom Wenn ich 2-Wege-Bindung sagte, was ich damit meinte, will ich den Text Box-Eingabe im übergeordneten und modalen Fenster, um zu ändern, wenn sich einer dieser Werte ändert. Zum Beispiel ist in meinem Beispiel das ng-Modell für "Eingabe" in Eltern und das "Eingabe" im modalen Fenster das gleiche. Wenn ich also etwas in die Elterneingabe eingib und dann das Modal öffne, kann ich sehen, dass die modale Eingabe den gleichen Wert hat. Aber wenn ich etwas in die 'Eingabe' der modalen Instanz eintippe, wird es nicht über die Elterneingabe aktualisiert. Wenn diese 2 vom selben ng-Modell gebunden werden, sollte es nicht aktualisiert werden? – Neel

Antwort

6

Ich denke, man den Eindruck hat, dass ng-model="textbox.sample" in den Eltern und ng-model="ngModel" im Modal gleich sind, weil Sie textbox.sample zum modalen sind vorbei und Sie sind in der Lage den richtigen Wert in dem modalen Fenster zu sehen . Der einzige Grund dafür ist, dass Sie die Eigenschaft $scope.ngModel bei jedem Öffnen des modalen Fensters explizit festlegen.

Eine Möglichkeit, dies zu tun, wie Sie erwarten, ist nur die $scope.textbox.sample Eigenschaft an beiden Orten zu verwenden, aber ich würde das nicht empfehlen.

Vielleicht ist der richtige Weg, um die modalInstance.result Versprechen, etwas zu verwenden wäre:

Erstellen Sie eine Schaltfläche auf den Modal und machen es ng-click="ok()"

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

ist und dann in der übergeordneten Steuerung, oder was auch immer öffnet das modale Fenster:

$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

Sie sind sehr richtig. Ich habe völlig missverstanden, da ich dachte, das ng-Modell durch open() zu übergeben, würde dem Modal denselben ng-Modellbereich geben und beide Modelle automatisch binden. Deine Antworten klären das für mich. Ich liebe Ihren Vorschlag, das 'modalInstance.result'-Versprechen zu verwenden, um das ng-Modell des Parents zu aktualisieren und mit der modalen Instanz zu synchronisieren. Macht Sinn! Ich werde das an meinem Code ausprobieren und werde es melden. – Neel

+0

Sorry, ich bin wieder da. In meinem Code gebe ich nun das aktualisierte ng-Modell über '$ modalInstance.close' weiter. Jedoch habe ich ein bisschen Mühe, den letzten Code im übergeordneten Controller hinzuzufügen, der das Versprechen verarbeitet. Wenn ich diesen Code hinzugefügt habe, bekomme ich den Fehler "modalInstance ist nicht definiert". Ich denke, dass ich diesen Code an einem falschen Ort innerhalb meines Eltern-Controllers platziere. Geht das innerhalb der '$ scope.open' Funktion oder außerhalb? Muss ich '$ modalInstance' DI auch im übergeordneten Controller hinzufügen? Entschuldigung, wenn das eine dumme Frage ist. – Neel

+1

Ja, Sie müssen das 'modalInstance.result' im selben Block ausführen, den Sie' modalInstance' definieren, d. H. 'Var modalInstance = $ modal.open ({...}); modalInstance.result.then (...) ' – Tom

1

Für mich keiner der oben genannten funktioniert.

Stattdessen musste ich tun, wie in this comment in github vorgeschlagen wurde.

Die Variable, die gebunden werden soll, muss ein Objekt sein, nicht nur ein einfacher Wert.

Zum Beispiel, wenn $scope.value nicht funktioniert, wird es funktionieren, wenn Sie $scope.someObject.value verwenden.

Verwandte Themen