AngularJS手表坏了

AngularJS手表坏了,angularjs,watch,Angularjs,Watch,手表坏了。 包括以下内容: <form class="search"> <div class="searchbar"> <input type="search" value="" data-ng-model="searchKeyword" placeholder="zoeken"> <button type="submit"><i class="glyphicon glyphicon-search"&g

手表坏了。 包括以下内容:

<form class="search">
    <div class="searchbar">
        <input type="search" value="" data-ng-model="searchKeyword" placeholder="zoeken">
        <button type="submit"><i class="glyphicon glyphicon-search"></i></button>
    </div>
</form>

一切似乎都很顺利,但是。。。当我开始输入名为searchKeyword的输入元素时,$watch on searchKeyword从不触发该函数

您是否尝试添加
true
,如下所示

$scope.$watch('searchKeyword', function (val) {
 /* your logic here */                    
}, true);
如果你想知道什么是
true
,下面是函数签名:

当objectEquality==true时,watchExpression的不等式根据angular.equals函数确定。要保存对象的值以供以后比较,请使用angular.copy函数。因此,这意味着观看复杂对象会对记忆和性能产生不利影响


显然,重要的是,它以不同的方式检查旧值和新值的相等性。如果(如果我错了,请纠正我)您正在查看的值是数组而不是字符串,我认为这是必要的。

手表必须是对象的属性,而不是对象本身,请参见此处的示例$rootScope.Scope,了解如何添加手表以及此处模型的使用。 你可以试试这个(我还没有测试过)

在控制器中:

$scope.search = {}


只需将以下内容添加到可能的解决方案列表中:

使用表格时:

使用ng模式将抑制对$watch的调用,除非输入被ng模式验证

所以以防万一,若有人使用ng模式,请在删除ng模式后尝试$watch

更多阅读:


最简单的方法是将true作为$watch的最后一个参数传递

更多阅读:


手表
放在控制器内而不是
启动搜索
上应该做什么?特别是因为它试图调用角度范围内的方法。在控制器中调用您的方法为什么要注入$rootScope?您是否在某个地方使用它,但您已经从代码示例中删除了该部分?除非别无选择,否则我通常会尽量避免使用$rootScope,但通常会有更好的解决方案。这个IMO不是问题的根源,只是好奇而已。当模板的ng include加载完成时,onload正在控制器内调用一个方法。当它准备好时,带有ng model=“searchKeyword”的元素将被激活。然后我想应用$scope.$watch('searchKeyword',function(){})。问题是它在$scope.initiateSearch=function(){}内。将手表放在示波器功能之外,可以使其重新工作。。这对我有用。试图捕捉对象的变化,但观察不够深入。干杯。任何对象的嵌套都需要这个。回答很好。如果你只需要一个对象或数组的浅表,而不是深表,那么使用
$watchCollection
来代替,如果我在ng repat中使用模型呢?例如,对于以下情况,$watch不起作用:
{{project.name}
$scope.$watch('searchKeyword', function (val) {
 /* your logic here */                    
}, true);
$watch(watchExpression, listener, [objectEquality]);
data-ng-model="search.keyword"
$scope.search = {}
$scope.$watch('search.keyword', ...