2016-03-03 59 views
0



我在jquery-ui自动完成的自动完成angularjs指令传递动态数据时遇到了麻烦。这里是我当前的代码:动态自动完成指令

HTML:

<div ng-app="peopleApp"> 
    <div ng-controller="indexController"> 
     <label class="input-group-addon input-label">Search:</label> 
     <input class="form-control input-form" id="search" type="text" placeholder="Search here..." auto-complete names="names"> 
     <button ng-click="change()">Change</button> 
    </div> 
</div> 

JS:

所有的数据
var peopleApp = angular.module('peopleApp', []); 


peopleApp.controller('indexController', function($scope, $http, $rootScope, $controller){ 
    $http.post(domainName+url) 
    .then(function(response){ 
     data = response.data.data; 
     $scope.names = data.map(function(obj){ var rObj = []; rObj.push(obj['rank_code']); rObj.push(obj['rank_description']); return rObj; }); 
    }); 

    $scope.change = function(){ 
     $scope.names = ["hnnnnn", "billlll"]; 
    } 
}); 


peopleApp.directive('autoComplete', function(){ 
    return { 
     scope: {names: '='}, 
     link: function(scope, element, attrs){ 
      // alert(JSON.stringify(element)); 
      attrs.$observe('names', function(val){ 
       // scope.info = val; 
       alert(val); 
       scope.names = val; 
      }); 
      element.autocomplete({ 
       source: scope.names, 
       select: function() { 
        // alert('dean'); 
        // iElement.trigger('input'); 
       }, 
       // Sets the min of characters before activating dropdown 
       minLength:2 
      }); 
     } 
    } 
}); 

首先是获取从API不会自动完成整合。第二我希望当我按下一个按钮时,将改变的$ scope.names也将被集成到自动完成功能中

+0

不要'jquery'用'angular'混库。原则上可以这样做,但有时候更容易找到'angular'的库。像这样[ngAutocomplete](http://ngmodules.org/modules/ngAutocomplete) –

+0

那么你有源动态或不动态的解决方案吗? –

+0

存在动态源使用的解决方案。例如[角度绑带头](http://mgcrea.github.io/angular-strap/#/typeaheads)。 –

回答

1

使用jQuery的工作解决方案autocomplete

jsfiddle上的现场示例。

function DefaultCtrl($scope) { 
 
    $scope.names = ["john", "bill", "charlie", "robert", "alban", "oscar", "marie", "celine", "brad", "drew", "rebecca", "michel", "francis", "jean", "paul", "pierre", "nicolas", "alfred", "gerard", "louis", "albert", "edouard", "benoit", "guillaume", "nicolas", "joseph"]; 
 
    $scope.addName = function() { 
 
    $scope.names.push($scope.name); 
 
    } 
 
} 
 

 
angular.module('MyModule', []) 
 
.controller('DefaultCtrl',DefaultCtrl) 
 
.directive('autoComplete', function($timeout) { 
 
    return { 
 
    restrict: "A", 
 
    scope: { 
 
     uiItems: "=" 
 
    }, 
 
    link: function(scope, iElement, iAttrs) { 
 
     scope.$watchCollection('uiItems', function(val) { 
 
     console.log(val); 
 
     iElement.autocomplete({ 
 
      source: scope.uiItems, 
 
      select: function() { 
 
      $timeout(function() { 
 
       iElement.trigger('input'); 
 
      }, 0); 
 
      } 
 
     }); 
 
     }); 
 

 
    } 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script> 
 
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/flick/jquery-ui.css" rel="stylesheet" type="text/css"> 
 
<div ng-app='MyModule'> 
 
    <div ng-controller='DefaultCtrl'> 
 
    <input auto-complete ui-items="names" ng-model="selected"> selected = {{selected}} 
 
    <br> 
 
    <input placeholder="add name" ng-model="name"> 
 
    <button ng-click="addName()"> 
 
     Add name 
 
    </button> 
 
    <pre>{{names|json}}</pre> 
 
    </div> 
 
</div>

+0

完美答案!谢啦! '范围。$ watchCollection'真的可以解决这个问题,但是你能解释一下它的用途吗?和语法的流程? –

+0

阅读[文档](https://docs.angularjs.org/api/ng/type/$rootScope.Scope)。或者看看[这里](http://www.bennadel.com/blog/2566-scope-watch-vs-watchcollection-in-angularjs.htm)。你将来需要它。 –