Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 在视图中更改时,控制器函数中的angular$scope属性未更新_Angularjs_Angularjs Scope - Fatal编程技术网

Angularjs 在视图中更改时,控制器函数中的angular$scope属性未更新

Angularjs 在视图中更改时,控制器函数中的angular$scope属性未更新,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我的视图中有一个绑定到范围属性的输入,如下所示: <input ng-model="searchTerm"> 这工作得很好,但我觉得奇怪的是,我需要在控制器中定义filteredArray属性和updateFilteredArray方法。是否有人能建议我应该这样做,或者是否有一种方法可以在不使用ng keyup指令的情况下更新过滤器?我认为双向数据绑定会消除更新过滤数组的特定方法的需要,并且当输入文本时,属性将在视图和控制器中使用的任何位置更新?尝试以下操作: <ul>

我的视图中有一个绑定到范围属性的输入,如下所示:

<input ng-model="searchTerm">
这工作得很好,但我觉得奇怪的是,我需要在控制器中定义filteredArray属性和updateFilteredArray方法。是否有人能建议我应该这样做,或者是否有一种方法可以在不使用ng keyup指令的情况下更新过滤器?我认为双向数据绑定会消除更新过滤数组的特定方法的需要,并且当输入文本时,属性将在视图和控制器中使用的任何位置更新?

尝试以下操作:

<ul>
   <li ng-repeat="item in filteredArray = (array | filter: searchTerm)"></li>
</ul>

如果您这样做,$scope.filteredArray将始终在控制器中更新-不需要方法

您只需使用
$watch
即可观察
searchTerm
,无需使用
ng keyup
指令:

控制器:

$scope.filteredArray = $filter('filter')($scope.array, $scope.searchTerm);

$scope.updateFilteredArray = function() {
   $scope.filteredArray = $filter('filter')($scope.array, $scope.searchTerm);
}
$scope.$watch('searchTerm', function(newValue, oldValue) {
  $scope.filteredArray = $filter('filter')($scope.array, newValue);
});

如果我理解您的问题,那么控制器中的代码只运行一次。因此,当它运行时,将应用过滤器。数据绑定的范围值,因此将更新
searchTerm
。然而,过滤器已经运行到该点,并且不会再次运行,数据绑定不能像那样工作。在视图中应用过滤器意味着应用了数据绑定,这就是它工作的原因。添加函数处理程序也可以工作,因为数据绑定意味着它将在每个加键事件上调用
updateFilteredArray
,这反过来会过滤控制器中的数组,数组上的数据绑定会进行RESTThank,这确实会产生我在没有ng加键的情况下所获得的相同结果。但是,如果我想在控制器中基于filteredArray设置另一个属性,例如$scope.filteredArray计数=$scope.filteredArray.length;如果在我的视图中使用此属性,则当筛选数组的长度更改时,计数不会更新。这可能是一个单独的问题,但如果FilterDarray属性更新成功,这似乎可以解决问题。有什么想法吗?如果在视图中使用它,它将随着数组的过滤而更新:{{filteredArray.length}-根本不需要在控制器中使用它。如果您需要对控制器内部的长度进行一些逻辑处理,它将只反映运行控制器代码时的值;每次长度改变时,必须再次执行逻辑。如果您只想根据不同的长度隐藏/显示视图元素,我建议使用ng show/ng hide,如下所示:无结果您还可以在搜索文本更改时对输入字段进行ng更改以运行代码:其中someMethod是控制器中的一种方法。您已经基本解决了我的问题。我想我需要在视图中包含尽可能多的逻辑。我的目标是对结果进行分页,其中包含“显示1-10/43”的结果计数,以及单击时显示上一个/下一个10个过滤结果的按钮。这要求我获取过滤数组的计数(用于计数),并在过滤数组发生变化时对其进行切片(以显示来自适当索引的结果块)。多亏了你的建议,我现在已经开始计算页数了。现在,我将尝试使用下一个/前10个结果按钮
$scope.filteredArray = $filter('filter')($scope.array, $scope.searchTerm);

$scope.updateFilteredArray = function() {
   $scope.filteredArray = $filter('filter')($scope.array, $scope.searchTerm);
}
<ul>
   <li ng-repeat="item in filteredArray = (array | filter: searchTerm)"></li>
</ul>
$scope.$watch('searchTerm', function(newValue, oldValue) {
  $scope.filteredArray = $filter('filter')($scope.array, newValue);
});