我具有以下功能,可以在前端为我对案件进行排序,该功能在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。

07-27 14:38