Javascript AngularJS,$watch跑两次,可以';t让新旧价值比较发挥作用

Javascript AngularJS,$watch跑两次,可以';t让新旧价值比较发挥作用,javascript,angularjs,angularjs-scope,watch,Javascript,Angularjs,Angularjs Scope,Watch,我正在使用AngularJS,我想观察一个变量是否发生变化,以及另一个变量是否减少。以下是我所拥有的: $scope.$watch('watchMe', function () { $scope.decreaseMe--; ) watchMe变量可用于所有作用域。我只有一个控制器,它既包含watchMe被更改的函数,也包含watchMe 每次更换watchMe时,Watch都会运行两次,我知道这就是Angular的工作方式。然而,这意味着减量将是错误的,因为它将减少两倍 我试着比较新旧

我正在使用AngularJS,我想观察一个变量是否发生变化,以及另一个变量是否减少。以下是我所拥有的:

$scope.$watch('watchMe', function () {
    $scope.decreaseMe--;
)
watchMe变量可用于所有作用域。我只有一个控制器,它既包含watchMe被更改的函数,也包含watchMe

每次更换watchMe时,Watch都会运行两次,我知道这就是Angular的工作方式。然而,这意味着减量将是错误的,因为它将减少两倍

我试着比较新旧价值观,但没能成功

我正在输出旧的/新的/减少的值,这是我在watchMe更改一次时得到的结果:

old: 7  new: 8 
decreasing  5
old: 7  new: 8 
decreasing  4 
当watchMe发生变化时,我该怎么做才能减少我一次


更新:

试图制作一个Plunkr来显示这一点,但在Plunkr$中,watch只会触发一次。这不起作用吗

$scope.$watch('watchMe', function( newVal, oldVal ) {
    if( newVal != oldVal ) {
        $scope.decreaseMe--;
    }
});

您应该共享更多的代码,这样我们就可以看到您是如何设置的。在任何情况下,我以前在页面上两次引用AngularJS库时都遇到过类似的问题。

我在使用指令模板和共享控制器时也遇到过类似的问题。这意味着您的控制器代码将运行两次

(尝试在控制器中输出到控制台,但在watch语句之外,为了证明这一点,您应该看到一个副本)

解决方案是将它们分离到自己的控制器中

例如


你能告诉我们,你是如何比较新旧价值的吗?一把小提琴或一把普朗克在这里会很有帮助。watchMe是如何与所有示波器共享的?除非它的根范围我不明白。我会尽快添加fiddle/plunkr。至于共享数据部分,我遵循以下示例:@Michael我按照下面Acrmui提供的答案中的建议进行了比较。但我并没有让它发挥作用(参见我对答案的评论),这就是我想用上面的输出来展示的。在执行的两个迭代中,newVal是8,oldVal是7。那意味着纽瓦尔oldVal将两次为真,decreaseMe将减少两次。不会
newVal!=oldVal
始终计算为
?将尽快共享fiddle/plunkr
.directive('directiveOne', function () {
    return {
        templateUrl: 'app/templates/directive-one.html',
        restrict: 'A',
        controller: 'directiveController'
    };
})
.directive('directiveTwo', function() {
    return {
        templateUrl: 'app/templates/directive-two.html',
        restrict: 'A',
        controller: 'directiveController'
    };
})
.directive('directiveOne', function () {
    return {
        templateUrl: 'app/templates/directive-one.html',
        restrict: 'A',
        controller: 'directiveOneController'
    };
})
.directive('directiveTwo', function() {
    return {
        templateUrl: 'app/templates/directive-two.html',
        restrict: 'A',
        controller: 'directiveTwoController'
    };
})