从控制器更改指令值

时间:2016-05-24 11:26:59

标签: angularjs

我有一个指令,用于控制器中的三个不同范围。现在我想在一个指令中调用一个函数,它将改变其他指令中的值。

result=[  { "_id":"1", "field1":"foo","field2":"xyz", "field3":"something" ...},
          { "_id":"4", "field1":"bar","field2":"lmn", "field3":"something" ...}]

在上面的代码中,当我在指令1中调用// 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;} 函数时,指令2中的变量nav不会改变。

如何克服这个问题?

2 个答案:

答案 0 :(得分:0)

您可以在指令中使用$ watch

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

当你在控制器中改变trigerVariable时,它会转移这个指令代码。

答案 1 :(得分: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是原始类型。当scope.controller.currentId值通过function(newId){$scope.obj2.currentId = newId;}更改为obj2指令时,除非指令再次加载,否则scope.currentId无法更新。

在这种情况下,您可以做两件事:

  1. 您可以删除scope.currentId并直接将scope.controller用于currentId。
  2. 您可以在指令中观看controller.currentId,并将新值设置为scope.currentId
  3. scope.$watch('controller.currentId', function(newValue, oldValue) {
        scope.currentId = newValue;
    })
    

    请参阅此Plunker