嵌套在ng-repeat中的ng-show不会更新

时间:2015-05-27 00:25:37

标签: javascript angularjs ng-repeat ng-show

我看了很多SO和Google,看到了为什么ng-show不能在ng-repeat内部工作(范围问题,绑定问题等)的一大堆原因但是我无法确定为什么我的不工作。我希望额外的一双眼睛可以帮助我。我对Angular很新,所以希望我的代码能够一些感觉。

目标:当$scope.current_set发生变化时,可见的lmf-optionset会发生变化。目前,只有第一个选项集通过Decision_Tree:loaded加载,然后当我尝试通过clickbox:clicked加载下一个选项集时,$scope.current_set会更改,但视图不会更新。

JS

angular.module('lmf.option_set', [])
  .controller('OptionsetCtrl', ['$scope', 'Optionsets', 'Decision_Tree',
    function($scope, Optionsets, Decision_Tree) {
      $scope.Optionsets = Optionsets;
      $scope.current_set = {
        name: null
      };

      $scope.$on('clickbox:clicked', function() {
        $scope.current_set = Decision_Tree.get_next_optionset();
      });

      $scope.$on('Decision_Tree:loaded', function() {
        $scope.current_set = Decision_Tree.get_next_optionset();
      });
    }
  ])

HTML

<div ng-controller='OptionsetCtrl'>
  <div ng-repeat='set in Optionsets.option_sets'>
    <div ng-show="set.name == current_set.name" lmf-optionset="{{set.name}}"></div>
  </div>
</div>

1 个答案:

答案 0 :(得分:1)

显然lmf-optionset为每个条目创建了一个独立的范围。这些子范围与父{q} current_set有关联,但它们并不保持双向绑定。因此,当您替换事件处理程序中的current_set 时,子范围不会意识到current_set已更改,并且它们仍然引用旧值。

您可以像这样重写事件处理程序:

$scope.current_set.name = Decision_Tree.get_next_optionset().name;

或者您可以使用controller as构造:

<div ng-controller='OptionsetCtrl as vm'>
  <div ng-repeat='set in Optionsets.option_sets'>
    <div ng-show="set.name == vm.current_set.name" lmf-optionset="{{set.name}}"></div>
  </div>
</div>