AngularJS:如何正确地设置/取消使用ng-repeat重复指令的变量
AngularJS: How to properly set/unset a variable with a directive repeated using ng-repeat?
我写了一个指令,基本上应该将全局作用域的变量设置为某个值,如果鼠标单击它并返回到默认值,一旦鼠标被释放。
我让它工作,但因为我刚刚开始使用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;
});
});
};
}
};
});
它工作如预期,但我不确定这是否是实现这一目标的最佳和最正确的方式。
我的问题是:
- 为此,我选择了正确的方法吗?
- 是否可以,我在链接函数中定义了mousedown方法,或者我应该使用"controller"选项为指令定义一个单独的控制器?
- 是否有一种方法来实现同样的事情(即只有一个参数的指令)?(我认为应该避免使用scope.$parent.$index)。
- 一般意见/建议?
我认为没有ngModel你可以更容易地完成同样的事情。你可以在指令中直接使用父作用域变量。只需要删除这一点:
scope: {
model: "=ngModel",
index: "@myDirective"
},
这意味着作用域是隔离的。您可以删除它,并简单地从链接函数的attrs
参数中读取索引。在控制器中保留一些状态$scope
:
$scope.data = {};
,然后在一个指令中,你可以像这样读/写东西到控制器的作用域(假设你的指令的作用域不再是孤立的):
$scope.data.someVar = 1
注意:在对象的子作用域中保留要读/写的变量是很重要的。为了更好地理解作用域继承,我建议阅读以下内容:
理解范围相关文章:
- 在表上使用 ng-repeat 指令
- 在angularjs ng-repeat指令中对对象进行排序
- 如何从 Angular ng-repeat 指令中检索数组中的某些索引
- 使用Angular js ng repeat指令过滤json对象
- AngularJS ng repeat指令,具有复杂的嵌套数据结构和动态键
- 访问ng repeat指令中的DOM
- 如何调用函数以在“ng-repeat”指令中呈现项目
- Angular 什么是在 ng-repeat 指令中访问总对象的最佳方式
- Angularjs ng-click() 不是从 ng-repeat 指令触发的
- ng-repeat指令中的角度选择:如何访问子范围
- AngularJS:如何判断我的控制器是否绑定到我的ng-repeat指令元素?我的数据没有显示
- 推送到数组不会通过ng repeat指令更新视图列表
- AngularJS:ng repeat指令中的条件
- 拆分在ng repeat指令中创建的字符串(ng模型)
- Angular:如何在ng repeat指令中使用自定义函数
- 使用Angular ng repeat指令进行重复时,复选框不起作用
- 如何在自定义指令中使用现有的ng repeat指令
- 将angularjs ng repeat指令与$scope一起使用$broadcast()/$scope$on()
- 带有Custom ng repeat指令的Custom Filter和LimitTo选项
- AngularJS -在ng-repeat指令中使用$setValidity