2014-10-20 58 views
0

比方说,我有两个可拖动的元素

<div draggable enabled="false"></div> 
<div draggable enabled="false"></div> 

要启用/禁用我用以下指令的内容:

App.directive('draggable', function() { 
return { 
restrict:'A', 
link: function(scope, element, attrs) { 
    element.draggable(); 

    scope.$watch('enabled', function (val) { 
    element.draggable(val === true ? 'enable' : 'disable'); 

    }); 
} 
};}); 

我已经安装$ watch看起来可以是真/假。 现在我想用我的控制器来改变'enabled'属性。

App.controller('TypeAheadController',function($scope){ 

//some code 
$scope.enabled = true; 
}); 

但是,当我使用这个,所有可拖动的元素被引用。所以他们都被启用或禁用。我认为这很奇怪,因为我期望$ watch可以在每个可拖动元素的范围内查找已启用的值。我的目标是单独启用/禁用可拖动元素。所以我需要一种方法来设置/引用控制器中每个可拖动元素的enabled属性。

回答

0

您可以更改指令,有它自己的范围:

App.directive('draggable', function() { 
    return { 
     restrict: 'A', 
     scope: { 
      enabled: '=' 
     }, 
     link: function (scope, element, attrs) { 
      element.draggable(); 

      scope.$watch('enabled', function (val) { 
       element.draggable(val === true ? 'enable' : 'disable'); 

      }); 
     } 
    }; 
}); 

为了使您的控制器控制每个单独的指令,你需要为每个指令相应的配置:

App.controller('TypeAheadController', function ($scope) { 
    $scope.draggableItems = [{enabled:true},{enabled: true}]; 
}); 

和在您的HTML中:

<div ng-repeat="draggable in draggableItems" draggable enabled="draggable.enabled"></div> 
+0

如何从外部访问本地范围莫如? 我需要将它设置在控制器内(就像我试图用$ scope.enabled = true所做的那样) – Ray 2014-10-20 18:33:28

+0

@Ray我认为潜在的问题与您将启用的属性绑定到Controller的功能有关属性。如果你想让每个指令都有它自己的'enabled'属性,你需要为每个指令使'enabled'成为一个数组。 – 2014-10-20 20:36:24

+0

“您需要为每个指令将'enabled'变为数组' 您会如何做到这一点? 如果我在我的更新版本中使用隔离范围,我对每个指令都有一个范围。所以这很好,但是我不知道如何从指令外引用它。所以基本上,问题是,如何根据来自指令外部的条件设置可拖动的'enabled'。 – Ray 2014-10-20 21:31:23