Ответ 1
Вам просто нужно какое-то промежуточное значение в своей области и привязать к нему флажки. В вашем контроллере - следите за тем, чтобы он менялся, и вручную восстанавливайте shirt.colors, в соответствии с этим значением.
<div ng-repeat='shirt in shirts'>
<h3>Shirt.</h3>
<label>Size: <input ng-model='shirt.size'></label><br/>
<label>Colors:</label>
<label ng-repeat="color in colors">
{{color.label}} <input ng-model="selection[$parent.$index][$index]" type="checkbox"/>
</label>
</label>
</div>
И в вашем контроллере:
$scope.selection = [[],[]];
$scope.$watch('selection', function () {
console.log('change', $scope.selection);
angular.forEach($scope.selection, function (shirtSelection, index) {
$scope.shirts[index].colors = [];
angular.forEach(shirtSelection, function (value, index2) {
if (value) $scope.shirts[index].colors.push($scope.colors[index2]);
});
});
}, true);
Вы можете протестировать его здесь: http://plnkr.co/edit/lh9hTa9wM5fkh3nT09RJ?p=preview