Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.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
Javascript $watch未按相同值启动_Javascript_Angularjs - Fatal编程技术网

Javascript $watch未按相同值启动

Javascript $watch未按相同值启动,javascript,angularjs,Javascript,Angularjs,我有下面的函数,它在前端为我排序案例,在ng单击时调用。参数是一个字符串,对于升序排序,参数'asc'传递给vm.sortCases;对于降序排序,参数'desc'传递给vm.sortCases vm.sortCases = function (byValue) { vm.selectedSorting = byValue; }; 我有一个手表设置如下,它监视vm.selectedSorting,它包含一个字符串: $scope.$watch('vm.selectedS

我有下面的函数,它在前端为我排序案例,在ng单击时调用。参数是一个字符串,对于升序排序,参数'asc'传递给vm.sortCases;对于降序排序,参数'desc'传递给vm.sortCases

 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(watchExpression,listener,[objectEquality])

注册在watchExpression更改时执行的侦听器回调。[…]仅当当前watchExpression和上一次调用watchExpression的值不相等时才会调用侦听器(初始运行除外,请参见下文)

这是通过设计实现的-变量可以在计算过程中重新设置,但最终为相同的值,此时不应触发
$watch
,因为依赖于该变量值的任何其他内容也不会发生更改

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

仅当变量更改值时才会触发:

$watch(watchExpression,listener,[objectEquality])

注册在watchExpression更改时执行的侦听器回调。[…]仅当当前watchExpression和上一次调用watchExpression的值不相等时才会调用侦听器(初始运行除外,请参见下文)

这是通过设计实现的-变量可以在计算过程中重新设置,但最终为相同的值,此时不应触发
$watch
,因为依赖于该变量值的任何其他内容也不会发生更改


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

是否有任何方法可以使变量在用户每次单击时被视为新变量?我以为转换成一个对象就能解决这个问题?由于其他原因,我不能在这个场景中使用ng click。嗯,是的,做一些类似于
函数AlwaysUnique(s){this.s=s:}
的操作,然后单击时总是设置为
新的AlwaysUnique(“asc”)
,并确保手表使用严格相等。Hacky,但它应该可以工作..严格相等作为第三个参数是真的,对吗?编辑我的帖子以显示我的想法--由于某些原因无法让你的建议起作用有没有办法让变量在用户每次单击时都被视为新的?我以为转换成一个对象就能解决这个问题?由于其他原因,我不能在这个场景中使用ng click。嗯,是的,做一些类似于
函数AlwaysUnique(s){this.s=s:}
的操作,然后单击时总是设置为
新的AlwaysUnique(“asc”)
,并确保手表使用严格相等。Hacky,但它应该能工作..严格相等作为第三个参数是真的,对吗?编辑我的帖子以显示我的想法--由于某种原因,无法让你的建议起作用