https://jsbin.com/yikobayuqa/edit?html,js,output
У меня есть два блока кнопок checkboxes, которые мне нужно переключать между тем, что читает значение переключателя.
Код, который я написал, показывает каждый блок, если rel. радио было выбрано, но оно не скроется, когда выбран другой переключатель, который я пытаюсь сделать.
Содержимое контроллера
$scope.choosenTopLevelReason = false;
$scope.reportTopLevelReasons = [{
title: "I do not think this should be on this site.",
subReasons:[{
title: "It is pornography",
on: false
},{
title: "It is distasteful",
on: false
},{
title: "It is spam",
on: false
}]
},{
title: "This does not interest me",
subReasons:[{
title: "Hide this",
on: false
}]
}];
Частичный HTML
<ul>
<li ng-repeat="reportTopLevelReason in reportTopLevelReasons">
<label><input type="radio" name="topLevelReason" value="{{reportTopLevelReason.title}}" ng-model="choosenTopLevelReason"> {{reportTopLevelReason.title}}</label>
<ul ng-show="choosenTopLevelReason == reportTopLevelReason.title">
<li ng-repeat="subReason in reportTopLevelReason.subReasons">
<label>
<input type="checkbox" ng-model="subReason.on" ng-checked="subReason.on">
{{subReason.title}}
</label>
</li>
</ul>
</li>
</ul>
Может ли кто-нибудь помочь?
Это происходит из-за того, что JavaScript Prototype Inheritance влияет $scope
.
В частности, вы привязываетесь к примитивному объекту $scope.choosenTopLevelReason
. Каждая итерация ng-repeat
создает новую унаследованную область, а присвоение chosenTopLevelReason
внутри ng-repeat
скрывает родительский примитив. Поэтому каждый радиокнопка просматривает свою собственную копию chosenTopLevelReason
.
Изменение этого объекта вместо примитива решает эту проблему.
$scope.choosenTopLevel = {};
<li ng-repeat="reportTopLevelReason in reportTopLevelReasons">
<label><input type="radio" name="topLevelReason"
value="{{reportTopLevelReason.title}}"
ng-model="choosenTopLevel.Reason">
{{reportTopLevelReason.title}}</label>
<ul ng-show="choosenTopLevel.Reason == reportTopLevelReason.title">
....
https://jsbin.com/sojolacumo/1/edit?html,js,output
Кроме того, ваш элемент <input>
в этом примере неверен (отсутствует </input>
), хотя это не вызывает проблемы здесь.
Я рекомендую внимательно прочитать Что такое нюансы объема прототипа/прототипического наследования в AngularJS? для глубокого погружения в то, почему примитив действует так, как он есть в этом сценарии.