当前位置: 首页 > 面试题库 >

ng-repeat不更新数组更新

浦琪
2023-03-14
问题内容

我正在通过ng-repeat循环渲染数据。而且我希望它在更新数组时进行更新。从我阅读的内容来看,这应该会自动发生,但是这是行不通的。那我在做什么错?

的HTML:

<tr ng-repeat="data in dataDifferenceArray">
    <td>
      {{data.name}}
    </td>
    <td>
      {{data.startData}}
    </td>
    <td>
      {{data.endData}}
    </td>
    <td>
      {{data.differenceData}}
    </td>
</tr>

控制器(此功能通过ng-click在按钮上触发):

$scope.getDifferences = function () {
  $scope.dataDifferenceArray = [];
  var i;
  for (i = 0; i < 20 ;i++) {
    $scope.dataDifferenceArray.push({
      name : 30,
      startData : 20,
      endData : 2,
      differenceData : 30
    })
  }
}

Console.log显示该数组已正确更新,但是我视图中的表未更改。我不知道我在做什么错。


问题答案:

那是因为您在method中更改了数组引用getDifferences

为了避免这种情况,我们使用 dot ,例如使用“ controller as”语法:

<div ng-controller="myController as c">
    [...]

    <tr ng-repeat="data in c.dataDifferenceArray">
        <td>
          {{data.name}}
        </td>
        <td>
          {{data.startData}}
        </td>
        <td>
          {{data.endData}}
        </td>
        <td>
          {{data.differenceData}}
        </td>
    </tr>
    [...]

如果您想了解范围是如何工作的,我会建议这篇文章:https : //github.com/angular/angular.js/wiki/Understanding-
Scopes#ngRepeat

另一个解决方案可能是:

$scope.getDifferences = function () {
  $scope.dataDifferenceArray.length = 0; // here ----
  var i;
  for (i = 0; i < 20 ;i++) {
    $scope.dataDifferenceArray.push({
      name : 30,
      startData : 20,
      endData : 2,
      differenceData : 30
    })
  }
}

但是在此解决方案中,您需要在外部创建数组(并且仅创建一次): $scope.dataDifferenceArray = [];

Edit2: 我的答案不是很清楚,让我们尝试深入了解正在发生的事情:

问: 为什么ng-repeat仍然有参考REFERENCE1?

您必须记住, 模板中不仅只有1个作用域

例如:ng-repeat指令为每个重复的元素创建新的作用域,但是我们仍然可以访问每个子作用域中的父作用域。Angular使用 Prototype
Inheritance
实现了此行为:由于其原型,每个子范围都继承了其父范围的属性。

您可以通过检查子元素上的元素来进行实验,然后在控制台中输入:($($0).scope()它将为您提供选定元素的范围,$0即选定元素(Chrome))。您现在可以看到,在相同的对象$($0).scope().$parent$($0).scope().__proto__,这是你的父母范围。

但是原型继承有一个问题:假设我们有继承,那A = {}; B = {C: 1}就是A继承。但是,如果我们影响一个新的价值,我们没有改变而已,。B``A.C == 1``A.C = 2``B``A

使用当前范围作为评估角表达式this。因此,如果我们有像ng-click="dataDifferenceArray = []"它相当于this.dataDifferenceArray = []this是其中所述元素的范围ng-click是。

当您使用 controller-as 时,此问题已解决 因为它将控制器注入到合并范围中,并且您将永远不会直接影响合并范围的属性。

让我们回顾一下示例:A = {}; B = {C: {D: 1}}如果A继承自Bthen A.C.D == 1。现在,即使我们影响了新的价值A.C.D = 2,我们B也改变了。



 类似资料:
  • 问题内容: 我有一个ng-repeat,它在更改正在使用的数组中的数据时不会更新。我已经研究了一段时间,但似乎没有任何效果。最初,当页面加载时,ng- repeat显示数据集的第一页,在获取新数据(下一页)并使用该数据设置该数组时,ng- repeat不会注意到更改,并且永远不会填充更新的数组。如果有人可以在正确的方向上指导我,将不胜感激。 }]); 问题答案: 尝试将tbody包装在div中,但

  • 问题内容: 当我尝试更新 ng-click 上的数组以更新ng-repeat的指令项时: selectL2menu() 在控制器上定义为: 单击一级菜单项后,它应立即显示带有相应元素的二级菜单块(通过使用相应值更新数组,请参见下文)。这是我需要在单击时更新的第二级菜单块: 点击事件触发时-我的阵列成功更新。但是,ng-repeat指令未更新我的第二级菜单(基于更新数组)。我尝试使用(和不使用)$

  • 问题内容: 这是我不工作的演示 模型保持不变。如何同步?请注意,数据结构很重要。 问题答案: 的结合将评估在当前范围的表达。作为创建一个子范围,这意味着将寻找一个命名属性的子范畴。在您的示例中,我们希望它在 父 范围内查找属性,该属性的别名为。 这是设计使然,可以通过引用表达式中的父范围来避免这种情况。 工作演示 代码(注意输入元素上的绑定已更改): 当您使用Angular 1.3的Beta版时,

  • 问题内容: 我正在尝试使用array 更新 ng-grid。我 这里 有个小伙伴。 添加按钮添加新行。更新按钮更新阵列中的最后一项。 选择一行并按更新按钮。没发生什么事。 按添加按钮。现在,UI将使用新元素&以及以前更新的元素进行更新。 相同的行为一次又一次地重复。 我试过了。我得到: “错误:$ apply已经在进行中” 我什至尝试通过将块放置在呼叫中来进行尝试。同样是同样的错误! 任何指针!

  • 问题内容: 我正在创建一个ajax搜索页面,该页面将由搜索输入框,一系列过滤器下拉列表以及随后显示结果的UL组成。 由于搜索的过滤器部分将在页面上的单独位置,因此我认为创建一个服务来协调输入和搜索服务器端的Ajax请求是一个好主意。然后可以通过几个单独的控制器来调用(一个用于搜索框和结果,另一个用于过滤器)。 我一直在努力的主要事情是在调用ajax时获得刷新结果。如果我将ajax直接放在Searc

  • 问题内容: 我创建了以下示例,以便您可以确切了解正在发生的事情:http : //jsfiddle.net/8t2Ln/101/ 如果我使用ng-options,也会发生同样的事情。我这样做有不同的原因,但由于简化了示例,所以省略了这一部分。 如您所见,默认情况下它具有两个选项。我将在选择旁边显示ng- model的选择值,以便您可以看到它的含义。当您在顶部添加第三个选项时,它会将值设置为该新选项