Подтвердить что ты не робот

Проблемы с автозаполнением jQuery + AngularJS

Я использую AjgularJS на своей странице и хочу добавить поле для использования автозаполнения из jqueryui, и автозаполнение не вызывает вызов ajax.

Я протестировал script на странице без angular (ng-app и ng-controller), и он работает хорошо, но когда я помещаю script на страницу с угловыми функциями, она перестает работать.

любая идея?

jquery script:

$(function () {

    $('#txtProduct').autocomplete({
        source: function (request, response) {

            alert(request.term);

        },
        minLength: 3,
        select: function (event, ui) {

        }
    });

});
  • Интересное примечание: когда я вызываю script в инспекторе Chrome, автозаполнение начинает работать!!!
  • Версии: AngularJS: 1.0.2 - JqueryUI: 1.9.0

ВЫВОД: Виджет автозаполнения из jQueryUI должен быть инициализирован изнутри пользовательской директивы AngularJS в качестве примера:

Разметка

<div ng-app="TestApp">
    <h2>index</h2>
    <div ng-controller="TestCtrl">

        <input type="text" auto-complete>ddd</input>

    </div>
</div>

Angular script

<script type="text/javascript">

    var app = angular.module('TestApp', []);

    function TestCtrl($scope) { }

    app.directive('autoComplete', function () {
        return function postLink(scope, iElement, iAttrs) {

            $(function () {
                $(iElement).autocomplete({
                    source: function (req, resp) {
                        alert(req.term);
                    }
                });
            });

        }
    });

</script>
4b9b3361

Ответ 1

Возможно, вам просто нужно сделать это с помощью "angular", то есть использовать директиву для настройки ваших элементов DOM и привязки событий, использовать службу для получения ваших данных и использовать контроллер, чтобы сделать свою бизнес-логику... все, используя при этом уровень полезности вложения, Angular...

Служба для получения ваших данных автозаполнения...

app.factory('autoCompleteDataService', [function() {
    return {
        getSource: function() {
            //this is where you'd set up your source... could be an external source, I suppose. 'something.php'
            return ['apples', 'oranges', 'bananas'];
        }
    }
}]);

директива для работы с настройкой плагина автозаполнения.

app.directive('autoComplete', function(autoCompleteDataService) {
    return {
        restrict: 'A',
        link: function(scope, elem, attr, ctrl) {
                    // elem is a jquery lite object if jquery is not present,
                    // but with jquery and jquery ui, it will be a full jquery object.
            elem.autocomplete({
                source: autoCompleteDataService.getSource(), //from your service
                minLength: 2
            });
        }
    };
});

И используя его в вашей разметке... обратите внимание на ng-модель, чтобы установить значение в области $с тем, что вы выбрали.

<div ng-controller="Ctrl1">
    <input type="text" ng-model="foo" auto-complete/>
    Foo = {{foo}}
</div>

Это просто основы, но, надеюсь, это помогает.

Ответ 2

Мне пришлось сделать немного больше работы, чтобы получить эту работу, используя службу $http.

Услуга:

app.factory("AutoCompleteService", ["$http", function ($http) {
    return {
        search: function (term) {
            return $http.get("http://YourServiceUrl.com/" + term).then(function (response) {
                return response.data;
            });
        }
    };
}]);

Директива:

app.directive("autocomplete", ["AutoCompleteService", function (AutoCompleteService) {
    return {
        restrict: "A",
        link: function (scope, elem, attr, ctrl) {
            elem.autocomplete({
                source: function (searchTerm, response) {
                    AutoCompleteService.search(searchTerm.term).then(function (autocompleteResults) {
                        response($.map(autocompleteResults, function (autocompleteResult) {
                            return {
                                label: autocompleteResult.YourDisplayProperty,
                                value: autocompleteResult 
                            }
                        }))
                    });
                },
                minLength: 3,
                select: function (event, selectedItem) {
                    // Do something with the selected item, e.g. 
                    scope.yourObject= selectedItem.item.value;
                    scope.$apply();
                    event.preventDefault();
                }
            });
        }
    };
}]);

html:

<input ng-model="YourObject" autocomplete />