【问题标题】:the $watch - method isnt changing the scope-variable$watch - 方法没有改变范围变量
【发布时间】:2015-11-04 14:41:17
【问题描述】:

在我的控制器中,我有一个 $scope.var=[] 当我单击一个按钮时,这个数组会充满内容。 所以 $scope.var.length 例如从 0 变为 1。

当数组被填满时,我想显示一个 div,所以它有一个

ng-if="condition".

这个条件也保存在控制器中:

$scope.controller = false.

现在我希望在数组填满时更改该条件:

$scope.$watch('var.length', function(){$scope.condition = true;});

现在(很重要!),还有第二个显示 div 的选项:带有

的按钮
ng-click="condition = !condition"

在测试中,ng-click 运行良好,条件在真假之间变化,但是当我用内容填充 var = [] 时,$watch-method 不起作用。 感谢您的帮助和提示:)

//编辑 html:

<div class="row">
            <div ng-click="condition= !condition">
                <span class="glyphicon clickable" ng-class="{'glyphicon-down': !condition, 'glyphicon-up': condition}" ></span>
            </div>
            <div class="slideToggle" ng-if="condition">
            Text hier
            </div>
    </div>

【问题讨论】:

  • 现在...ng-if 创建一个单独的范围...并且内联单击将采用当前范围级别 - 所以您可能在两个不同的范围级别定义了一个 condition 变量.发布您的 HTML。
  • 你是如何“填充”数组的?这可能是你的问题。

标签: javascript angularjs


【解决方案1】:

你可以只看 var 本身而不是 var.length

查看此示例:http://jsfiddle.net/Lzgts/577/

代码 -

   $scope.$watch('var', function(newVal, oldVal){
            console.log(newVal);
            if(newVal.length > 0 ){
                $scope.condition = true;
            }else{
                 $scope.condition = false;  
            }
        });

这应该对你有用。

或者,您可以查看 var.length,但您仍然需要在内部使用一些 if/else 逻辑来检查 newVal 是否实际上为 0。像这样:

  $scope.$watch('var.length', function(newVal, oldVal){
            if(newVal === 0){
             $scope.condition = false;  
            } else { 
             $scope.condition = true;   
            }
        });

【讨论】:

  • 当我删除 ng-click="condition = !condition" 时,它正在工作。所以问题一定存在
  • @samron 你也可以发布你的html
  • 好的,我做到了,我认为这是关于不同的范围
  • @samron 一个非常快速的测试来检查是否会将 ng-if 更改为 ng-show
  • 我测试了它:手表功能正在工作:newVal 正在改变!但条件不是
【解决方案2】:

这样的代码可能会导致几个问题。
您可以查看我的代码:
plnkr
$scope.$watch('var.length', function(newE) { if (newE > 0) { $scope.condition = true; } });

  1. var 更改数组的方式,如果它们相等,则必须重新初始化它。这不是一个非常聪明的想法,但在其他方面你必须确保你的数组填充创建新的数组并且 angular 可以看到。
  2. 在我的例子中,要更改必须使用 $timeout 的范围,因此请注意不要陷入 $apply 循环。

【讨论】:

    【解决方案3】:

    好的,我做到了:

    更改ng-click="condition = !condition"ng-click="reverse()"

    并在控制器中定义函数:

     $scope.reverse= function(){
                        $scope.condition= !$scope.condition;
                    };
    

    那么条件也在改变,因为它现在在同一个范围内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多