limitless.directive('multiCheckbox', ['config', function (config) { return { restrict: 'E', replace: true, templateUrl: config.baseUrl + 'app/shared/multicheckDirectiveView.html', scope: { source: '=', model: '=' }, controller: function ($scope) { $scope.$watch('source', function (newv, oldv) { if (newv!==oldv) $scope.model.length = 0; for (var i = 0; i < $scope.source.length; i++) $scope.source[i].$description = $scope.source[i][$scope.descriptionSelector]; }); $scope.onChange = function (item) { if ($scope.isChecked(item)) { $scope.removeFromModel(item); } else { $scope.addToModel(item); } }; $scope.isChecked = function (item) { var matches = _.filter($scope.model, function (element) { if (element[$scope.comparatorSelector] === item[$scope.comparatorSelector]) { return element; } }); return matches.length > 0; }; $scope.addToModel = function (item) { var clone = angular.copy(item); delete clone.$description; $scope.model.push(clone); }; $scope.removeFromModel = function (item) { $scope.model = _.reject($scope.model, function (element) { return element[$scope.comparatorSelector] === item[$scope.comparatorSelector] }); }; }, link: function ($scope, el, attrs) { $scope.comparatorSelector = attrs.selector; $scope.descriptionSelector = attrs.description; } } }]);