2014-01-10 18 views

答えて

31

ような何かを探しています。それを使用するための最良のオプションが設定ロジックのどこかで、あなたのshowLightbox関数を呼び出すことですので

<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!'); 
     } 
    }); 
}); 

fiddle

+0

MBielskiの方がより正解です。 (この場合は)$ watchではなくブール値を使用してください。 – mortsahl

+1

ng-showが外側のコントローラのスコープで発生したときに、内側のコントローラで関数を呼び出す必要がある場合、Andree Shustariovの提案されたアプローチがネストされたコントローラの状況で必要になります。この状況では、外部コントローラが内部コントローラのスコープと機能を認識していないため、MBielskiのアプローチは機能しません。 –

+0

"Controller as"構文を使用すると、ネストされたコントローラの問題が解決しますが、これはまだ$ watchにとっては最適な方法ではありません。 – MBielski

14

まあ、NG-ショーは、ブール値をとります。ここでは

は一例ですng-show。

$scope.reasonToShow = false; 

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

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

必要に応じて、$ watchと似たようなことができます。

+6

ng-showで表示されている要素内の要素にフォーカスを設定しようとしていますか? – Trevor

10

どのような簡単なアプローチですか?

のは、あなたがこのような要素を持っているとしましょう:

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

あなたはdisplayMyDiv後にAND演算子を使用して、そこにコールバックを入れた場合、最初の値がTRUEの場合、コールバックにのみ実行されます(どのようです論理AND演算子が動作します)。 だから、これは私が角度1.15.10で試してみました何であり、それは動作します:

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

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

場合とsomeBooleanValueがtrueの場合にのみ、その後、$ scope.showLightboxは()も評価されます。したがって、$ scope.showLightbox()をTRUEに戻す必要があります。そうしないと、divは表示されません。

この方法は、オブザーバの実装を角度(保持するコードが少ない)に処理するだけでなく、someBooleanValueがTRUEに変更された場合にのみコールバックの戻り値が評価されます。

+0

非常に単純で完全に機能します。非常に良い解決策。 – DVK

関連する問題