2014-01-10 14 views

Antwort

31

Ich denke, es wäre besser, Ihr Modell $watch, auf dem ng-Show gebunden ist.

Hier ist Beispiel:

<div ng-app="myApp" ng-controller="myCtrl" ng-init="isDisplayed = true"> 
    <div ng-show="isDisplayed">something</div> 
    <button ng-click="isDisplayed = !isDisplayed">Toggle</button> 
</div> 

var myApp = angular.module('myApp', []) 
.controller('myCtrl', function($scope, $log) { 
    $scope.$watch('isDisplayed', function(newValue, oldValue) { 
     if (newValue !== oldValue) { 
      $log.log('Changed!'); 
     } 
    }); 
}); 

und fiddle

+0

MBielski hat die richtige Antwort. Verwenden Sie einen booleschen Wert, nicht $ Watch (in diesem Fall) – mortsahl

+1

Der vorgeschlagene Ansatz von Andrey Shustariov wird in einer verschachtelten Controller-Situation benötigt, wenn Sie eine Funktion auf dem inneren Controller aufrufen müssen, wenn ng-show im Bereich des äußeren Controllers auftritt. In dieser Situation funktioniert MBielskis Ansatz nicht, da der äußere Controller den Umfang und die Funktion des inneren Controllers nicht kennt. –

+0

Die Verwendung der "Controller as" -Syntax löst das verschachtelte Controller-Problem, und dies ist immer noch nicht die beste Verwendung für eine $ watch. – MBielski

14

Nun, ng-Show nimmt einen Booleschen Wert, so dass Ihre beste Option, um es für die Verwendung ist Ihre showLightbox Funktion irgendwo in der Logik zu nennen, die Sets ng-zeigen.

$scope.reasonToShow = false; 

$scope.showSomething = function(myCondition){ 
    if(myCondition){ 
     showLightbox(); 
     $scope.reasonToShow = true; 
    } 
}; 

<div ng-show='reasonToShow'></div> 

Sie könnten etwas Ähnliches mit einer $ Uhr tun, wenn Sie müssen.

+6

Worauf konzentrieren Sie sich auf ein Element innerhalb des Elements, das von ng-show angezeigt wird? – Trevor

10

was ist mit einem einfacheren Ansatz?

sagen wir, Sie ein Element wie dieses:

<div ng-show="someBooleanValue"></div> 

Wenn Sie einen AND-Operator nach displayMyDiv verwenden und einen Rückruf dort setzen, würde der Rückruf nur ausgeführt werden, wenn der erste Wert TRUE ist (das ist, wie die logischer UND-Operator funktioniert). So ist das, was ich mit Winkel 1.15.10 ausprobiert und es funktioniert:

$scope.showLightbox = function() { 
    // your logic goes here 
    return true; 
} 

<div ng-show="someBooleanValue && showLightbox()"></div> 

Wenn und nur wenn someBooleanValue wahr ist, dann $ scope.showLightbox() wird auch ausgewertet werden. Sie müssen also $ scope.showLightbox() setzen, um TRUE zurückzugeben, sonst ist Ihr div nicht sichtbar.

Dieser Weg ist nicht nur einfacher, er behandelt auch die Observer-Implementierung in eckig (weniger zu wartender Code), und die Callback-Rückgabe wird nur ausgewertet, wenn sich someBooleanValue auf TRUE ändert.

+0

Sehr einfach und funktioniert perfekt. Sehr gute Lösung. – DVK

Verwandte Themen