angular没有看到JSON数组中的所有对象

时间:2016-01-20 14:08:14

标签: javascript arrays angularjs json

所以我有这部分代码

empty string

这一行内部一切正常

$scope.pauseChecked = function(monitorId, groupName) {
  for (var i = 0; i < $scope.monitorResults.length; i++) {
    if (document.getElementById('checkboxId').checked) {
      adminService.pauseMonitor(monitorId, groupName).then(function(response) {
        $scope.getMonitorResultsForSelectedGroups();
        $scope.filterResults();
        var keepGoing = true;
        angular.forEach($scope.monitorResults, function(monitor) {
          if (keepGoing) {
            if (monitor.id == monitorId && groupName == monitor.groupName) {
              monitor.triggerRunning = false;
              keepGoing = false;
            }
          }
        });
      });
    }
  }
};

这一行不在ng-repeat

之内
<tr ng-repeat="result in monitorResults" ng-click="setSelected(result.id)" ng-class="{highlighted: result.id === selectedRow, selected: checkboxId}">

以及它在页面上的显示方式

<td ng-show="monitorResults.triggerRunning"><button class="btn btn-info" style="width: 150px" ng-click="pauseChecked(monitorResults.id, monitorResults.groupName)">Pause Checked </button></td>

这是我在调试器中看到的

enter image description here

你可以看到什么,我已经取代了&#34;结果&#34; on&#34; monitorResults&#34;,因为它让我访问一个数组,但事情是当我通过调试器检查代码时我发现monitorId和groupname是未定义的。那么我已经使用了monitorResults [0] .id和monitorResults [0] .groupName但它只是让我访问数组中的第一个元素,如何获取对每个元素的访问权?

2 个答案:

答案 0 :(得分:2)

由于您有两个表解耦,因此在检查结果时需要在作用域中设置模型,并且该模型是您应在暂停按钮中引用的模型。实际上,所有的monitor,run和pause方法都不需要在方法中传递变量,这些方法应该在内部引用范围变量checkboxId。检查框应该将结果设置为true,以供其他方法使用。

有意义吗?

修改

我还会将checkboxId更改为result.checked并将其设置为true或false。然后,其他操作的控制器方法应遍历结果列表并查找已检查的结果,并使用它。

<强>模式

用于这样的两个解耦表的模式是在数组中的模型底部设置表2,用于所需的操作,如“isChecked”,“isPaused”或其他任何操作。

表1然后有调用控制器方法的按钮。这些方法遍历数组并检查切换属性的状态(isChecked,isPaused或其他)。然后,这些方法通过调用另一个方法并传入符合条件的模型来执行所需的操作。

视图表彼此不可知,识别模型的所有工作都发生在控制器中。视图唯一能做的就是更新数组项的属性。

答案 1 :(得分:0)

解释你的功能:

$scope.pauseChecked = function(monitorId, groupName) { //you might be getting monitorId and group name properly
  for (var i = 0; i < $scope.monitorResults.length; i++) { //maybe you are looping to get all selected elements
    if (document.getElementById('checkboxId').checked) { //this will never work properly, because it will only find the first element(due to id which may/maynot be checked), plus why are you trying to do this?
      adminService.pauseMonitor(monitorId, groupName).then(function(response) { 
        $scope.getMonitorResultsForSelectedGroups();
        $scope.filterResults();
        var keepGoing = true;
        angular.forEach($scope.monitorResults, function(monitor) {
          if (keepGoing) {
            if (monitor.id == monitorId && groupName == monitor.groupName) {
              monitor.triggerRunning = false;
              keepGoing = false;
            }
          }
        });
      });
    }
  }
};