$ watch没有触发相同的价值

时间:2016-03-19 20:00:22

标签: javascript angularjs

我有以下函数在前端为我排序,在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};
    };

1 个答案:

答案 0 :(得分:0)

$watch仅在变量更改值时触发:

  

$watch(watchExpression, listener, [objectEquality]);

     

每当watchExpression发生更改时,都会注册要执行的侦听器回调。 [...]只有当前watchExpression的值和之前对watchExpression的调用不相等时才会调用侦听器(初始运行除外,见下文)。

这是设计的 - 变量可以在计算过程中重新设置,但最终是相同的值,此时$watch不应该触发,因为没有别的东西取决于那个变量的值也会发生变化。

如果您希望每次用户点击按钮时触发操作,则应使用onclick或ng-click。