angularjs - Angular directives collaboration -
so here trying implement autocomplete suggestion angular , need expertise.
here html:
<div my-autosuggest> <input type="text" my-autosuggest-input> <ol> <li ng-repeat"item in items" my-autosuggest-list>...</li> </ol> </div> i don't want use templates generate <li> elements. (i want flexible use kind of element in order , maybe other elements in between list , dropdown)
the hard part respond arrow keys on input highlight next/prev element in list. how let other directive my-autosuggest-list know should select next element my-autosuggest-input directive.
note might have multiple autosuggests in 1 controller this:
<div ng-controller="mycontroller"> <div my-autosuggest> <input type="text" my-autosuggest-input> <ol> <li ng-repeat"item in items" my-autosuggest-list>...</li> </ol> </div> <div my-autosuggest> <ol> <li ng-repeat"item in items" my-autosuggest-list>...</li> </ol> <input type="text" my-autosuggest-input> </div> </div> so far have tried $watch index change sometime watch wont called elements in list (maybe it's bug). $broadcast won't work because input might wrapped in controller or inside element broadcast won't heard list.
i tried put variable each autosuggest in root scope order in directives called in not parent child cannot initialize variable , create new 1 each time my-autosuggest called because my-autosuggest-input or others might called before that.
any suggestion on how design angular appreciated.
assuming my-autosuggest-input , my-autosuggest-list inside my-autosuggest. use series of $emitted , $broadcast events accomplish this.
inside my-autosuggest-input's link function add $emit when arrow key pressed:
element.on('keyup', function () { // figure out if arrow key, if so: $scope.$emit('listselect', { message: 'previtem' }); // or 'nextitem' }); inside my-autosuggest link function or controller add:
// add controllerid, listener doesn't handle own events. $scope.controllerid = math.random().tostring(); $scope.$on('listselect', function (e, data) { if ($scope.controllerid !== data.controllerid) { $scope.$broadcast('listselect', { controllerid: $scope.controllerid, message: data.message }); } }); finally, inside my-autosuggest-list's link function or controller add:
$scope.$on('listselect', function (e, data) { if (data.message === 'nextitem') { // highlight next item. } else { // highlight previous item. } }); in scenario my-autosuggest routes listselect events of children of children.
Comments
Post a Comment