2016-05-24 4 views
0

コントローラーの3つの異なるスコープで使用される指令があります。今私はあるディレクティブで関数を呼び出すと、他のディレクティブの値が変更されます。上記のコードでコントローラーから指令値を変更する

// HTML 
<my-directive instance-type="obj1"></my-directive> 
<my-directive instance-type="obj2"></my-directive> 
<my-directive instance-type="obj3"></my-directive> 

// Directive 
    return { 
       restrict: 'E', 
       scope: { 
        controller: '=instanceType' 
       }, 
       templateUrl: 'app/pages/class/templates/list.html', 
       link: function (scope, element, attrs) { 

        // Bind controller value 
        scope.currentId = scope.controller.currentId; 
        scope.nav = function(newId) { 
          scope.controller.nav(newId); 
        }; 
} 


// Controller 
$scope.obj1 = {}; 
$scope.obj2 = {}; 
$scope.obj3 = {}; 
$scope.obj1.nav = function(newId){$scope.obj2.currentId = newId;} 

、iはディレクティブ1 nav関数を呼び出すときディレクティブ2における可変currentIdは変化しません。

この問題を解決するにはどうすればよいですか?このディレクティブコードtrigerコントローラでそれを変更した場合trigerVariable

+0

プランナーを作成してください。 –

+0

スコープを使用します。$ apply();リンクの一番下にある:function –

+0

分離スコープを使用しているため、値は2番目のディレクティブで変更されません。 2つの選択肢があります。本当にディレクティブにスコープを分離する必要がある場合は、分離スコープを削除するか、サービスを使用してディレクティブ間で状態を共有してください。 – Sarathy

答えて

0

var id1 = 1; 
 
var id2 = 2; 
 

 
id1 = 3; 
 

 
// What do you expect to print for id2 variable? Does it change? No. 
 
alert(id2);

、あなたのscope.currentIdはプリミティブ型です。 obj2ディレクティブの値がfunction(newId){$scope.obj2.currentId = newId;}からscope.controller.currentIdに変更された場合、ディレクティブが再度ロードされない限り、scope.currentIdが更新されることはありません。あなたはscope.currentIdを削除し、currentIdに直接scope.controllerを使用することができます

  1. :この場合

    、あなたは、2つのことを行うことができます。

  2. controller.currentIdをディレクティブで表示し、新しい値をscope.currentIdに設定することができます。
scope.$watch('controller.currentId', function(newValue, oldValue) { 
    scope.currentId = newValue; 
}) 

このPlunkerを参照してください。

+0

それは動作します。ありがとうございました! –

0

あなたのディレクティブ

scope.$watch('trigerVariable', function(newValue, oldValue) { 
    //change your variable 
}, true); 

で$ウォッチを使用することができます。ただ、上記の例のように

関連する問題