2017-12-18 2 views
0

Ich arbeite an einer AngularJS-Anwendung, und ich habe eine Aufgabe, die etwa wie folgt ist:
1) Klicken Sie auf eine Schaltfläche.
2) Wenn VariableA === Wahr, Ausgabe eines Modals.
3) Wenn VariableA === Falsch ist, wechseln Sie zu einem anderen Link, ohne ein Modal aufzurufen.
Ändern Sie Daten Ziel durch Javascript

Nun, ich versuche es mit dem folgenden Code

HTML zu erreichen:

<span id = "id1" ng-click="getClickType($event,row)" href=""> Text </span> 

JS:

$scope.getClickType = function(event,row){ 
    $scope.activeElement = event.target; 
    if(row.type == "A"){ 
     $scope.activeElement.dataset.target = "#ModalA"; 
     $scope.activeElement.dataset.toggle = "modal"; 
     /* Here I don't have to use the hack and the data target changes automatically and the modal pops up*/ 
    } 
    else{ 
     someFunction().then(someOtherFunction); 
    } 
} 

someOtherFunction(msg){ 
    if (msg.varA == true){ 
     var f1 = $scope.activeElement.dataset.target; //hack 
     $scope.activeElement.dataset.target = "#ModalB"; 
     $scope.activeElement.dataset.toggle = "modal"; 
     if(f1 != $scope.activeElement.dataset.target){ //hack If statement 
      $timeout(function() { 
          $scope.activeElement.click(); 
         }); 
      /* Here i have use a hack and click on the element again to show the modal*/ 
     } 
    } 
    else{ 
     $scope.activeElement.dataset.target = ""; 
     $scope.activeElement.dataset.toggle = ""; 
     window.open(someURL); 
     /* works fine*/ 
    } 
} 

So können Sie sehen, ich bin mit einem Hack für ModalB. Wenn Sie das Dataset.target in someOtherFucntion() ändern, wird das Modal nicht angezeigt. Ich muss erneut auf das aktive Element klicken, damit es angezeigt wird.

Meine Frage ist:
Warum muss ich erneut auf das ActiveElement klicken, um das Datenziel zu ändern.
Warum wird es nur in der zweiten Funktion benötigt.

Jede Hilfe würde sehr geschätzt werden.

Vielen Dank im Voraus.

Antwort

0

Was passiert in someFunction? Ist es ein eckiges Versprechen wie z. $ q oder $ http? Haben Sie versucht, modalB stuff in $ scope auszuführen. $ Apply function?

Es gibt einen Trick, wenn Sie versehentlich von Winkel Umfang erhalten oder Sie nicht Winkel Skript

$scope.$apply(function() { 
    $scope.activeElement.dataset.target = "#ModalB"; 
    $scope.activeElement.dataset.toggle = "modal"; 
} 

Ausführung oder Sie können $ scope nennen. Anwenden $ direkt nach dem offenen ModalB

$scope.activeElement.dataset.target = "#ModalB"; 
$scope.activeElement.dataset.toggle = "modal"; 
$scope.$apply() 

Diese wird eckig machen, um Verdauen durchzuführen und Überprüfungen durchzuführen. ABER es gibt eine Fallstricke in diesem, wenn Sie im eckigen Kontext sind, kann es bereits durchführen Digest-Schleife, wird es einen Fehler, der Sie informiert, dass dieser Prozess bereits im Gange ist, so ist Ihr Fehler woanders.

+0

Hallo, In einigenFunktion, ich rufe eine gespeicherte Prozedur aus der Datenbank, die dann ein Versprechen zu someOtherFunction mit dem Resultset (msg) zurückgibt. Könntest du mir bitte erklären "Hast du versucht, modalB-Sachen in $ scope auszuführen. $ Apply function"? Wie kann ich das erreichen? -Danke –

+0

Eine andere Sache, ist dieses Versprechen von $ http behandelt? Wenn nicht, schlage ich vor, dieses Versprechen mit $ q.when zu übergehen: https://docs.angularjs.org/api/ng/service/$q#when – erhardos

+0

Hallo, es wird von $ http behandelt. Ich kann keine Änderungen vornehmen, da es von allen Controllern in der Anwendung verwendet wird. Ich habe versucht, die Anweisungen unter $ scope auszuführen. $ Apply und rannte auch $ scope. $ Apply nach dem Ändern des Dataset-Ziels, aber ohne Erfolg. Selbst wenn ich den Hack benutze, würde ich gerne verstehen, warum es passiert. –

Verwandte Themen