当我在angularjs中使用.scope()时会发生什么?

时间:2014-06-25 14:15:34

标签: javascript angularjs angularjs-directive angularjs-scope

当我在指令中使用.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()正在做什么以及如何利用它来发挥我的优势。

1 个答案:

答案 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);
    }
}

也许从这里你可以用更简单的方式重构。