Javascript AngularJS:如何正确设置/取消设置使用ng repeat重复指令的变量?

Javascript AngularJS:如何正确设置/取消设置使用ng repeat重复指令的变量?,javascript,angularjs,Javascript,Angularjs,我写了一个指令,基本上应该将全局范围的一个变量设置为某个值,如果鼠标点击它并在鼠标释放后返回默认值 我让它工作,但由于我刚刚开始使用angular,我真的尝试做正确的事情,甚至避免从坏的编程习惯开始 指令中也有一些DOM操作,但我将其简化为更改值的基本功能 这是HTML: <th ng-repeat="item in list" my-directive="{{$index}}" ng-model="clicked.current"></th> 这是简化指令: app.

我写了一个指令,基本上应该将全局范围的一个变量设置为某个值,如果鼠标点击它并在鼠标释放后返回默认值

我让它工作,但由于我刚刚开始使用angular,我真的尝试做正确的事情,甚至避免从坏的编程习惯开始

指令中也有一些DOM操作,但我将其简化为更改值的基本功能

这是HTML:

<th ng-repeat="item in list" my-directive="{{$index}}" ng-model="clicked.current"></th>
这是简化指令:

app.directive("myDirective", function () {
    return {
      scope: {
        model: "=ngModel",
        index: "@myDirective"
      },
      template: "<button ng-mousedown='mousedown()'>click</button>",
      link: function(scope, elm, attrs) {
        scope.mousedown = function () {
          scope.model = scope.index;
          angular.element(document).one("mouseup", function () { // react even if dragged out of element bounds
            scope.$apply(function () {
              scope.model = -1;
            });
          });
        };
      }
    };
  });
它正在按预期工作,但我不确定这是否是实现这一目标的最佳和最正确的方法

我的问题是:

为此,我是否选择了正确的方法? 我应该在link函数中定义mousedown方法,还是应该使用controller选项为指令定义一个单独的控制器? 是否有一种方法可以实现相同的目标,即仅使用指令的一个参数?我读过一篇文章,应该避免使用scope.$parent.$index。 一般性意见/建议?
谢谢你抽出时间

我认为,如果没有ngModel,您可以更轻松地完成同样的任务。 您可以直接使用指令中的父范围变量。只需删除此位:

  scope: {
    model: "=ngModel",
    index: "@myDirective"
  },
这意味着范围是隔离的。您可以删除它,只需从link函数中的attrs参数读取索引。 在控制器$scope中保留某些状态:

然后在指令中,您可以将内容读/写到控制器的作用域,假设您的指令的作用域不再是孤立的:

$scope.data.someVar=1

注意:在对象中保留要从子作用域读/写的变量非常重要。为了更好地理解作用域继承,我建议阅读以下内容:


很难判断你做的事情是否正确,因为你试图解决的问题非常模糊。无论如何,在指令中使用事件绑定是完全可以的,没有问题。另外,建议使用ngModelController使用ngModel。我不确定如何比第一句话更清楚地表达它。单击元素->x=当前元素的索引,释放鼠标->x=-1。正如我所说的,这个指令是有效的,我只是想知道我在正式意义上是否做得正确。我会调查ngModelController…我不认为这是最佳实践。特别是如果我想重用组件,一个独立的作用域应该是最好的选择,对吧?我想你是对的。如果您计划重用该组件,那么将其与父范围耦合是一个坏主意。ngModelController是一个不错的选择。
$scope.data = {};