2017-06-22 5 views
0

渡された値がtrueの場合に実行されるシンプルなディレクティブをテストしようとしましたが、一度しか動作しません。angleディレクティブ、ブール値付き双方向データバインディングは一度だけ実行されます

ディレクティブ:

.directive('myDirective', function(){ 
     return { 
      restrict: 'A', 
      scope: { 
       triggerObj: '@myDirective' 
      }, 
      link: function (scope, elem, attrs) { 
       scope.$watch('triggerObj', function() { 
        alert('success') 
       }); 
      } 
     }; 
    }) 

コントローラ:

$scope.triggerObj = {}; 
$scope.triggerObj.trigger = false; 

$scope.passValue = function(){ 
    //set to true 
    $scope.triggerObj.trigger = true; 
} 

ビュー:

<div my-directive='{[triggerObj.trigger]}'> 
<button type='button' ng-click='passValue()'>click</button> 

もtrueに設定する前に、値をfalseにリセットしようとしたが、まだそれは一度だけ動作します。

+0

あなたtriggerObjは= triggerObj –

+0

との代わりに@triggerObjの結合を試みが、その場合には、ブラケットをビューから削除する必要があるが、結果は私が$ scope.triggerObjを入れてみました同じ – user1751287

答えて

1

passValue()ファンクションセット$scope.triggerObj.triggertrueのように機能します。そして、古い値が新しい値に等しくない場合にのみ、あなたの$watchが働いているが、あなたtruefalseから最初の変更$scope.triggerObj.trigger、および他のすべての時間のナッシングの変更は、(あなただけ再びtruetrueから$scope.triggerObj.triggerを変更しようとしています)。

トリックを行うには、これに$scope.passValue機能をアップグレードしよう:

$scope.passValue = function() { 
    if($scope.triggerObj.trigger) { 
    $scope.triggerObj.trigger = false; 
    } else { 
    $scope.triggerObj.trigger = true; 
    } 
} 
+0

ままであることを試みた2つの方法ではありません.trigger = false; before $ scope.triggerObj.trigger = true; '$ scope.triggerObj.trigger = false'はコントローラロード時に1つしか動作しないため、 – user1751287

+0

@ user1751287のように動作しません。私の答えに書いた '$ scope.passValue'関数をアップグレードしてみてください。これが役に立ちます。 –

+0

私もそれを関数内に入れましたが、まだ動作しません...編集された答えを参照 – user1751287

1

双方向データを用いて達成されるバインディングのようなpassValue機能を変更したときに動作します'='ではなく '@'。

scope: { 
    triggerObj: '=myDirective' 
} 
関連する問題