我的模板中有这样的内容:
<input name="searchText" placeholder="Search" data-type="search"
ng-model="searchText"
ng-change="searchRecords()"
ng-keyup="onKeyUp()">
当我到达该模板时,调用searchRecords()
函数(触发ng-change)。我希望仅在我开始输入时调用searchRecords()
(更改searchText
将触发ng-change
)。现在,它在控制器初始化时被触发。
我尝试在控制器中将searchText
设置为null
,''
,但它是相同的。
这种行为是设计还是我遗漏了什么?
修改
我意识到此代码触发了我的searchRecords()
:
$scope.$watchGroup(['daysBefore', 'daysAhead'], function (newValues, oldValues, scope) { ... }
修改
我删除了ng-change
并添加了此内容:
$scope.$watch('searchText', function (newValue, oldValue) {
$scope.searchRecords();
});
在$scope.searchText
没有任何更改的情况下,此代码正在控制器初始化上执行。
答案 0 :(得分:5)
您可以使用ng-init设置标志,例如:&#34; NG-INIT =&#39;初始化=真&#39; &#34;,并在ng-change功能中检查
答案 1 :(得分:1)
您不需要使用ng-change,您可以为该输入的ng-model创建观察者。
$scope.$watch(function() {
return $scope.searchText;
}, function(n, o) {
if(n != o){
$scope.searchRecords();
}
}, true);
<input ng-model="searchText">
干杯
答案 2 :(得分:0)
如果你有一个ng-model,那么有一个ng-change事件是正常的。 你应该对$ scope.searchText var进行$ watch。
答案 3 :(得分:0)
我在google网上找到了一个有关角度的帖子 - https://groups.google.com/forum/#!topic/angular/uXldMqsQvRw
手表会在注册时自动(并通过$ evalAsync异步)触发,这会初始化观察者并让您的代码知道初始值是什么。
如果这是不受欢迎的,那么您可以将此检查放入您的保存方法中:
function save(newVal,oldVal){ if(newVal === oldVal)返回; //在这里做点什么 }
所以,是的,我想摆脱这样的代码,但显然我不能