如何在ng-repeat使用的数组中的每一行上设置一个字段为false?

时间:2014-01-06 13:51:16

标签: javascript angularjs

我有一个表的代码:

<table>
   <tr data-ng-class="{clicked: row.current == true}"
       data-ng-click="grid.view.forEach(function(object) { object.current = false; }); row.current = true"
       data-ng-repeat="row in grid.view = (grid.data | filter:isInRange">
   <td>{{ row.id }}</td>
   <td>{{ row.current }}

我在ng-click行上遇到语法错误。我不确定我是否使用了正确的语法。我所拥有的是数组的每一行都包含字段和一些对象。我想为所有行设置字段current为false,然后为我单击的那个设置为true。如果我省略了点击的第一个javascript语句,则不会出现语法错误。

2 个答案:

答案 0 :(得分:2)

在控制器中定义函数(或者你喜欢的任何地方),然后将其名称传递给你的标记:

$scope.x = function(){
  // do some stuff
}

// in markup
<tr ng-click="x()">

我强烈建议尽可能在标记中抽象这些内容。将来会更加可维护。

答案 1 :(得分:1)

ng-clickng-repeat中的代码是angular expressions并且分别是angular repeat expressions,而不是任意的java脚本代码。 Angular表达式是JavaScript的一个子集,由angular的$ parse服务处理。遗憾的是,表达式语法并没有很好地记录,但afaik并在检查角度源中的parse.js之后,不支持函数的定义(function(){ ...}中的ng-click部分)。我还认为,=中的作业(ng-repeat)并非真正受到支持。

在这些情况下,最好只调用@Sprottenwels在答案中指出的范围中定义的函数。

在旁注中,不是在每一行中都有一个布尔标志row.current,在您的作用域中指向所选行的单个变量$scope.selectedRow可能更简单。然后你的代码变成了:

<tr data-ng-class="{clicked: row == selectedRow}"
    data-ng-click="selectRow(row)"
    data-ng-repeat="row in grid.data | filter:isInRange">

// in the controller
$scope.selectRow = function(row) {
    $scope.selectedRow = row;
}