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

数组更改未触发$ watch

卫和洽
2023-03-14
问题内容

我试图弄清楚为什么$watch没有触发我。这是相关控制器的片段:

$scope.$watch('tasks', function (newValue, oldValue) {
    //do some stuff
    //only enters here once
    //newValue and oldValue are equal at that point
});

$scope.tasks = tasksService.tasks();

$scope.addTask = function (taskCreationString) {
    tasksService.addTask(taskCreationString);//modifies tasks array
};

在我看来,tasks显然是正确更新的,因为我的长度范围是这样的:

<span>There are {{tasks.length}} total tasks</span>

我想念什么?


问题答案:

尝试$watch('tasks.length', ...)$watch('tasks', function(...) { ... }, true)

默认情况下,$
watch
不检查对象是否相等,而仅作为参考。因此,$watch('tasks', ...)将总是简单地返回相同的数组引用,并且不会改变。

更新: Angular v1.1.4添加了一个$
watchCollection()
方法来处理这种情况:

Shallow监视对象的属性,并在任何属性更改时触发(对于数组,这意味着监视数组项,对于对象映射,这意味着监视属性)。如果检测到更改,listener则触发回调。



 类似资料:
  • 问题内容: 我有一个针对ui-select2下拉菜单的手表设置(来自ui-bootstrap)。手表会在加载时触发,但不会在数据更改时触发,我不知道为什么。 不应用模型更改或不使用第三个参数进行相等性比较(至少来自我的代码)不是一个常见的问题。 我需要怎么做才能使其点火? 这是一个说明问题的小问题。 问题答案: 我修好了一些东西。 http://plnkr.co/edit/5Zaln7QT2gET

  • 我的组件具有以下功能: 我可以在我的html页面中插入选择菜单,但更改事件不会在我选择项目时触发。有人能让我知道为什么会发生这种情况吗? 谢谢

  • 问题内容: 我正在尝试使用所有动态元素创建一个层叠下拉列表。 我的HTML: 我有2个使用ajax加载元素的函数,都可以正常工作: 我需要根据站点选择来调用GetSectors。我有这个: 但这是行不通的。我正在使用jQuery 1.8.3。 知道哪里出了问题吗? 谢谢! 问题答案: 尝试 事件委派 : 事件冒泡的行为使我们可以执行“事件委托” — 将处理程序绑定到高级元素,然后检测哪个低级元素启

  • 我有一个在本地运行良好的函数,但在Azure中不会触发,除非该函数是“唤醒”的。该函数只是将项从一个容器复制到另一个容器,主键和id列交换(作为最终一致的辅助索引)。该应用程序中有两个函数,都是Cosmos触发器(不同的源容器和租约前缀);我的所有其他功能都在其他应用程序中。 该函数在Linux消耗计划中,通过GitHub Action部署,该操作使用zip部署,应该是同步触发器。没有其他函数侦听

  • 我有一个父组件,在parent.component.html中有以下代码: 在子组件中,我有如下输入参数: 还有一个名为 当父输入被修改时,我希望子输入执行< code>getSpecs()函数。这可能吗?

  • 当用户滑动滑块时,我试图触发一个事件,当滑动停止时,该值会更改。根据jQuery文档,对于这种情况,事件是理想的选择。所以我正在尝试: 然而,我观察到,当我向右拖动滑块并再次将其拖回起点(页面加载时滑块的初始位置)时,警报仍会触发。这是jQuery错误吗?如果没有,我该如何解决这个问题?