AngularJS typeahead + multi select tags

前端 未结 1 1248
深忆病人
深忆病人 2020-12-30 12:56

What I\'m looking for is a input that resembles Gmails typeahead for email addresses

\"enter

相关标签:
1条回答
  • 2020-12-30 13:13
    .directive('typeahead', function () {
        return {
            restrict: 'AEC',
            scope: {
                model: '=ngModel'
            },
            link: function link($scope, $element, $attrs) {
                $scope.$watch('inputValue', function (value) {
                    $scope.changed();
                });
    
                $scope.Emails = ['a@a.com', 'b@b.com', 'c@c.com'];
    
                $element.bind("keydown keypress", function (event) {
                    switch (event.keyCode) {
                        case 40:
                            $scope.$apply(function () {
                                if ($scope.selected < $scope.List.length) {
                                    $scope.selected++;
                                }
                            });
                            event.preventDefault();
                            break;
                        case 38:
                            $scope.$apply(function () {
                                if ($scope.selected > 0) {
                                    $scope.selected--;
                                }
                            });
                            event.preventDefault();
                            break;
                        case 13:
                            $scope.$apply(function () {
                                $scope.selectAndClose($scope.List[$scope.selected]);
                            });
                            event.preventDefault();
                            break;
                        case 32:
                        case 188:
                            $scope.$apply(function () {
                                inputValues = $scope.inputValue.split(',');
                                for (var i = 0; i < inputValues.length; i++) {
                                    if (inputValues[i].length > 0) {
                                        $scope.GetOrCreateEmailAndSelect(inputValues[i]);
                                    }
                                }
                                $scope.clear();
                                $scope.close();
                            });
                            event.preventDefault();
                            break;
                        case 27:
                            $scope.$apply(function () {
                                $scope.close();
                            });
                            event.preventDefault();
                            break;
                        case 8:
                            $scope.$apply(function () {
                                if ($scope.inputValue == null || $scope.inputValue.length == 0) {
                                    $scope.model.pop();
                                }
                            });
                            break;
                    }
                });
    
                $scope.remove = function (emailid) {
                    $scope.model.splice($scope.model.indexOf(emailid), 1);
                }
    
                $scope.changed = function () {
                    fetchEmail({
                        'EmailAddress__icontains': $scope.inputValue
                    }).then(function (data) {
                        $scope.List = data;
                        if (typeof ($scope.model) === typeof ([]) && $scope.model !== null) {
                            for (var i = 0; i < $scope.model.length; i++) {
                                for (var j = 0; j < $scope.List.length; j++) {
                                    if ($scope.List[j].id == $scope.model[i].id) {
                                        $scope.List.splice(j, 1);
                                    }
                                }
                            }
                        }
                        $scope.selected = 0;
                        dropdownShow = false;
                        if ($scope.List.length > 0) {
                            if (typeof ($scope.inputValue) !== 'undefined' && $scope.inputValue !== null) {
                                if ($scope.inputValue.length > 1) {
                                    dropdownShow = true;
                                }
                            }
                        }
                        $scope.dropdownShow = dropdownShow;
                    });
                };
    
                $scope.selectAndClose = function (value) {
                    $scope.select(value);
                    $scope.clear();
                    $scope.close();
                };
    
                $scope.select = function (value) {
                    $scope.model.push(value);
                };
                $scope.clear = function () {
                    $scope.inputValue = null;
                };
                $scope.close = function () {
                    $scope.dropdownShow = false;
                };
                $scope.GetOrCreateEmailAndSelect = function (EmailAddress) {
                    EmailAddress = EmailAddress.toString();
                    data = $scope.fetchEmail(EmailAddress); //you can add an ajax call here
                    if (data.length == 0) {
                        $scope.CreateEmail(EmailAddress);
                    } else {
                        $scope.select(data[0]);
                    }
                });
    
            $scope.fetchEmail =function(EmailAddress) {
                result = [];
                for (var i = 0; i < $scope.Emails.length; i++) {
                    if ($scope.Emails[i].indexOf(EmailAddress) > -1) {
                        result.push($scope.Emails[i]);
                    }
                }
            }
    
            $scope.CreateEmail =function(EmailAddress) {
                $scope.Emails.push(EmailAddress);
            };
        }
        $scope.mouseoverChoice = function (emailidobject) {
            $scope.selected = $scope.List.indexOf(emailidobject);
        };
        $scope.editEmailId = function (emailidobject) {
            $scope.inputValue = emailidobject.EmailAddress;
            $scope.remove(emailidobject);
        }
        $scope.CheckSelected = function (element) {
            if (typeof ($scope.List) !== 'undefined' && typeof ($scope.selected) !== 'undefined' && typeof ($scope.List[$scope.selected]) !== 'undefined') {
                return $scope.List[$scope.selected].id == element.id;
            } else {
                return false;
            }
        }
    },
        templateUrl: 'typeaheadtemplate.html',
    }
    });
    
    0 讨论(0)
提交回复
热议问题