无法在ng-repeat中调用$ scope函数

时间:2016-11-06 10:17:58

标签: javascript angularjs

我有这个函数showPopupSelectTopic(subject)来调用我的ng-repeat html代码。但它根本不起作用。

         <div style="width:100%;" ng-controller="manageStudyCtrl">
            <div class="div-subject" ng-repeat="subject in dataSubject" ng-click="showPopupSelectTopic(subject)">  
                <div class="round-button-subject-2">
                    <div class="subject-name-2 subject-eng" style="color:{{subject.subject_code.colour_code}}">
                        {{subject.subject_code.short_name}}
                        <div>{{subject.avg_overall_coverage | number : 0}}%</div>
                    </div>
                    <circular-progress
                        value = "subject.avg_overall_coverage"
                        max="100"
                        orientation="1"
                        radius="36"
                        stroke="8"
                        base-color="#b9b9b9"
                        progress-color="{{subject.subject_code.colour_code}}"
                        iterations="100"
                        animation="easeInOutCubic"
                    ></circular-progress>
                </div>
            </div>
          </div>

我想在我的控制器中调用showPopupSelectTopic(subject),以便我可以弹出并操作数据。

我在ng-repeat以外的地方做过,而且工作得很好。但是,如果我在ng-repeat中使用它,它将无法按预期执行。如何解决这个问题?

我的控制器:

angular.module('manageStudy', [])
.controller('manageStudyCtrl', function($scope,){

$scope.showPopupSelectTopic = function(subject) {
    alert(subject.chapter_id);
};
});

2 个答案:

答案 0 :(得分:1)

由于每个ng-repeat都创建了自己的子范围,因此无法实现。话虽这么说,任何函数调用都会导致孩子将一些变量复制到自己的范围内。你必须使用他们的parentcope或参考你的控制器的原点$scope

ng-click="$parent.showPopupSelectTopic(subject)"

这应该可以解决问题。但是,它有点脏。更好的解决方案是返回您的父母范围,并在每个子范围内使用它。因此,在控制器内部声明一个函数(例如$scope.getScope)并让它只返回其$scope。之后,您将能够正确访问它。

$scope.getScope = function() {
  return $scope;
}

ng-click = "getScope().showPopupSelectTopic(subject)"

答案 1 :(得分:0)

ng-repeat仅适用于可迭代的对象,如数组或集合。在打开要重复的div之前,可以在范围内准备好iterate able对象。尝试使用ngInit而不是ngClick来初始化阵列,然后再尝试使用ngRepeat