我看了很多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>
答案 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>