当我在指令中使用.scope()时,有人可以解释一下发生了什么吗?
我有一个指定用于创建方格网格的指令。在加载时,我希望这些方块可以点击,所以我已经分配了
ng-click="disabled || add($index)"
然后在link: function () {}
我跑:
scope.add = function (index) {
scope.disabled = true;
}
以便所有这些都在点击时被禁用。
然后我有一个服务,它获取一个被点击的框的索引,运行一些逻辑,然后带回其他可以点击的可能方格。该服务返回索引数组,例如[2,5,6,7]
然后我接受那个数组,循环遍历它,并通过它们的索引分配这些框可以点击:
for (var x = 0; x < arr.length; x++) {
var nScope = el.children().eq(arr[x]).scope();
nScope.disabled = false;
}
之后,当点击上面的另一个元素时,原始的scope.disabled = true;
将被忽略,我在循环中设置的可点击的元素仍然可以点击...为什么?当我在上面运行.scope()
时会发生什么,如何刷新网格以便再次无法点击,直到服务返回更多可能的移动?
当然,如果有更合适的方法可以做到,请分享。
编辑:
在评论中添加更多代码:
HTML模板:
<div
class="cell"
ng-click="disabled || addItem($index)"
ng-disabled="disabled"
ng-repeat="cell in ngModel.grid track by $index">{{item}}</div>
该指令的设置如下:
return {
restrict: 'A',
require: 'ngModel',
scope: {
ngModel: '='
},
templateUrl: 'scripts/grid/grid.html',
link: function () {
//code above goes here
}
}
服务正在做各种事情,其中之一是根据最初点击的对象的索引提供可以点击的对象。出于这个问题的目的,我遗漏了服务代码,因为我到目前为止唯一的问题是确切地知道.scope()正在做什么以及如何利用它来发挥我的优势。
答案 0 :(得分:0)
这并不完全回答你的问题,但可能是你建立的方法。
请参阅此小提琴:http://jsfiddle.net/HB7LU/4553/
var myApp = angular.module('myApp',[]);
myApp.service('myService', function() {
return{
saveBox: function(id)
{
alert('gonna update box with id: '+id);
}
}
});
myApp.directive('boxgenerator', ['myService', function(myService) {
return {
template: '<div class="box {{status}} - {{id}}">{{status}}</div>',
scope:{
id: '@id',
status: '@status'
},
link : function(scope, element, attrs)
{
element.bind("click",function(){
save = myService.saveBox(scope.id);
scope.status = 'disabled';
scope.$apply();
});
}
}
}]);
function MyCtrl($scope) {
$scope.boxes = [];
$scope.box = { status: 'enabled' };
for (i = 0; i < 9; i++)
{
$scope.boxes.push($scope.box);
}
}
也许从这里你可以用更简单的方式重构。