app .directive('ngTagsinput', function() { return { restrict: 'A', require: '?ngModel', link: function(scope, element, attrs, ngModel) { if (!ngModel) return; if (!angular.isArray(ngModel.$viewValue)) ngModel.$setViewValue([]); var tags = element.tagsinput( { freeInput: false } )[0]; scope.$watch(attrs.ngItems, function(func) { tags.typeahead({ source: func }); }); ngModel.$render = function() { if (angular.isArray(ngModel.$viewValue)) { for (var i = 0; i < ngModel.$viewValue.length; i++) { if (tags.itemsArray.indexOf(ngModel.$viewValue[i]) === -1) { tags.add(ngModel.$viewValue[i], !!scope.$$phase); } } } else if (!scope.$$phase) { tags.removeAll(); } }; } }; });