我遍历了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>

最佳答案

显然,lmf-optionset为每个条目创建一个隔离范围。这些子作用域具有指向父项的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>

09-20 11:38