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