Ответ 1
Так как ng-repeat создает дочернюю область для каждого типа/элемента/итерации, нам нужно связать ng-модель для каждого типа с родительской областью, а не с дочерней областью. Один из способов сделать это - использовать $parent:
<input type="checkbox" ng-model="$parent[type]">{{ type }}
Если $scope.types определен как в ответе @Alex, тогда свойства typeOne
, typeTwo
и typeThree
появятся в родительской области, если щелкнуть соответствующий флажок, а значение свойства будет be true
. Если отмеченный флажок установлен, свойство остается, и значение переключится на false
. Поэтому ваш код должен будет проверить наличие несуществующих свойств и свойств, которые существуют со значением, установленным как true или false. Это немного грязно.
Я предпочел бы предопределить массив объектов в родительской области, где каждый объект имеет тип (имя) и логическое значение, указывающее, выбран ли он или нет:
$scope.types = [
{name: 'typeOne', selected: false},
{name: 'typeTwo', selected: false},
{name: 'typeThree', selected: false}];
Затем $parent не требуется (потому что значение "type" будет ссылкой на родительский объект, а не на копию значения родительского свойства (примитивного)):
<input type="checkbox" ng-model="type.selected">{{ type.name }}
См. также Каковы нюансы объема прототипа/прототипного наследования в AngularJS?, чтобы узнать больше о ng-repeat и дочерних областях.