Je voudrais utiliser un contrôle d'entrée standard qui est décoré de ng-model
y ng-required
et ensuite ajouter ma propre directive d'attribut personnalisée qui fournit uib-typeahead
au contrôle.
J'ai utilisé ce lien pour faire fonctionner partiellement ma directive.
Ajouter des directives à partir d'une directive dans AngularJS
PLUNKR - La version 2 de la directive ne fonctionne pas correctement avec ng-model
Ma directive ajoute la fonctionnalité de typeahead et cela fonctionne très bien, mais elle ne lie pas le modèle au contrôle après la sélection de l'élément.
J'ai deux versions de ma directive.
Version 1 : est une directive de style d'élément et je l'ai utilisée avec succès pendant un certain temps, mais elle s'est révélée insuffisante lorsque j'ai voulu avoir un peu plus de contrôle sur l'élément d'entrée, notamment lorsque j'ai voulu utiliser ng-required='true' et d'autres directives ng-message.
Version 2 est une directive de style d'attribut, je l'ai choisi parce que j'ai pensé qu'il était préférable d'ajouter la fonctionnalité de typeahead que je voulais à n'importe quel HTML standard qui peut utiliser facultativement la directive ng-required='true'
, ng-model
etc...
Bien que cette directive fonctionne en grande partie, elle n'interagit pas correctement avec ng-model
et je ne suis pas sûr de savoir comment le faire fonctionner.
angular.module(APP)
.directive('wkLocationSuggest', ['$compile', function ($compile) {
return {
restrict: 'A',
require: 'ngModel',
replace: false,
//terminal: true,
//priority: 0,
scope: {
wkApiModel: '=' // Provide access to the internal data that is returned via the API lookup
},
controller: 'LocationSuggestController',
link: function (scope, element, attrs, ngModelCtrl) {
if (!ngModelCtrl) {
return;
}
element.attr('typeahead', 'location as row.location for row in typeAhead($viewValue)');
element.attr('typeahead-wait-ms', '750');
element.attr('typeahead-on-select', 'onSelectInternal($item, $model, $label)');
element.attr('typeahead-min-length', '2');
element.attr('typeahead-focus-first', 'true');
element.removeAttr("wk-location-suggest"); //remove the location-suggest to avoid indefinite loop
element.removeAttr("data-wk-location-suggest"); //also remove the same attribute with data- prefix if it exists
// None of this is working
//// invoked when model changes from the outside
//ngModelCtrl.$render = function () {
// //scope.innerModel = ngModelCtrl.$modelValue;
//};
////// invoked when model changes from the inside
//scope.onChange = function (value) {
// ngModelCtrl.$setViewValue(scope.innerModel);
//};
scope.onSelectInternal = function ($item, $model, $label) {
// This fires, but it effects the ng-model on the first input,
// but not the input that this directive is attached too
ngModelCtrl.$setViewValue($item.location);
};
$compile(element)(scope);
}
};
}]);
Ces deux images illustrent une partie du problème, mais il est préférable de faire un test par vous-même en utilisant PLUNKR ci-dessus.