我具有以下功能,可以在前端为我对案件进行排序,该功能在ng-click上调用。参数是字符串,参数'asc'传递给vm.sortCases进行升序排序,对于降序排序'desc'。
vm.sortCases = function (byValue) {
vm.selectedSorting = byValue;
};
我有一个监视设置如下,监视vm.selectedSorting,其中包含一个字符串:
$scope.$watch('vm.selectedSorting', filterAndSortingSearch);
手表的回调:
function filterAndSortingSearch(newValue, oldValue) {
if (newValue === oldValue) {
return;
}
fetchData();
}
如果用户单击两次asc,则手表只会触发一次(第一次),为什么呢?即使传递了相同的字符串,如何才能使手表回调运行?我希望这样,当用户单击两次并且两次通过“ asc”时,手表也会触发两次,这现在还没有发生。我尝试将true作为手表中的第三个参数传递,但这没有用。我也尝试过像这样转换字符串:
vm.sortCases = function (byValue) {
var objForEqualityComparison = {sortOrder: byValue}
vm.selectedSorting = objForEqualityComparison.sortOrder;
};
这就是我最后要做的。我将字符串转换为对象内部,并观看了该对象而不是字符串值:
vm.sortCases = function (byValue) {
vm.selectedSorting = {direction: byValue};
};
最佳答案
$watch
仅在变量更改值时触发:
$watch(watchExpression, listener, [objectEquality]);
注册当watchExpression更改时要执行的侦听器回调。 [...]仅当当前watchExpression的值与上一次对watchExpression的调用的值不相等时才调用侦听器(初始运行除外,请参见下文)。
这是设计使然-可以在计算过程中重新设置变量,但最终会获得相同的值,此时$watch
不应触发,因为取决于该变量值的其他任何更改都不会改变。
如果要让用户每次单击按钮时触发操作,则应使用onclick或ng-click。