首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >jQuery autocomplete + AngularJS的问题

jQuery autocomplete + AngularJS的问题
EN

Stack Overflow用户
提问于 2012-10-19 00:39:15
回答 3查看 30.5K关注 0票数 20

我在我的页面上使用AjgularJS,并希望添加一个字段来使用jqueryui中的自动完成功能,但自动完成功能不会触发ajax调用。

我已经在没有angular (ng-app和ng-controller)的页面上测试了这个脚本,它工作得很好,但是当我把脚本放在一个有angularjs的页面上时,它就停止工作了。

有什么想法吗?

jquery脚本:

代码语言:javascript
复制
$(function () {

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

            alert(request.term);

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

        }
    });

});

  • 有趣的注意:当我调用Chrome检查器上的脚本时,自动完成会启动working!!!
  • Versions: AngularJS: 1.0.2 - JqueryUI: 1.9.0

结论:来自jQueryUI的autocomplete小部件必须从AngularJS的自定义指令内部进行初始化,如下所示:

标记

代码语言:javascript
复制
<div ng-app="TestApp">
    <h2>index</h2>
    <div ng-controller="TestCtrl">

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

    </div>
</div>

Angular script

代码语言:javascript
复制
<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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-23 05:29:36

也许你只需要用一种“棱角分明的方式”去做……也就是说,要使用指令来设置DOM元素和执行事件绑定,使用服务来获取数据,并使用控制器来执行业务逻辑...所有这些都利用了Angular依赖注入的好处……

获取您的自动补全数据的服务...

代码语言:javascript
复制
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'];
        }
    }
}]);

执行设置自动完成插件的工作的指令。

代码语言:javascript
复制
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- $scope使用您选择的内容在模型上设置值。

代码语言:javascript
复制
<div ng-controller="Ctrl1">
    <input type="text" ng-model="foo" auto-complete/>
    Foo = {{foo}}
</div>

这只是基础知识,但希望能有所帮助。

票数 38
EN

Stack Overflow用户

发布于 2013-10-24 00:37:50

我必须做更多的工作才能使用$http服务使其正常工作。

服务:

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

指令:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<input ng-model="YourObject" autocomplete />
票数 14
EN

Stack Overflow用户

发布于 2020-05-25 17:47:36

HTML

代码语言:javascript
复制
 <input type="text" class="form-control ml-2" employeesearchautocomplete ng-model="employeeName" name="employeeName">

JS

代码语言:javascript
复制
 var myApp = angular.module("employeeSearchModule",[]);

        myApp.controller("employeeSearchController",function($scope,$http){

            $scope.message= "Welcome to angular js..."

        });

        myApp.directive('employeesearchautocomplete', function() {
            return {
                restrict: 'A',
                require : 'ngModel',
                link : function (scope, element, attrs, ngModelCtrl) {
                      element.autocomplete({
                          source : function(request, response) {
                            $.ajax({
                                type : "POST",
                                url : "searchEmployee.html",
                                data : request,
                                success : response,
                                dataType : 'json'
                            });
                        },
                        select : function(event, ui) {
                            event.preventDefault();
                            if (ui.item.value == '-1') {
                                scope.employeeName ='';
                                scope.$apply();
                            } else {
                                scope.employeeName = ui.item.label;
                                scope.$apply();

                            }
                        },
                        focus : function(event, ui) {
                            event.preventDefault();
                            scope.employeeName = ui.item.label;
                            scope.$apply();
                        },
                        change : function(event, ui) {
                            if (!ui.item) {
                                scope.employeeName ='';
                                scope.$apply();

                            }
                        }
                      },{
                            minLength : 2
                      });


                }
            }
        });

脚本文件导入顺序

  • All your jquery
  • AngularJs library
  • your angular script for autocomplete

我希望这能对某些人有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12959516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档