2016-12-28 4 views
3

Je veux faire un matériau angulaire sélectionner un travail comme mon sélection angulaire d'interface utilisateur. J'ai un peu de travail mais il y a une différence: l'ui angulaire select peut avoir un objet qui n'est pas dans sa liste dans son ng-model.Faire un matériau angulaire sélectionner se comporter comme angulaire ui sélectionner

Fiddle for better understanding

<ui-select ng-model="current_item" name="emitter" autocomplete="off" theme="select2" style="max-width:385px;"> 
    <ui-select-match placeholder="Select Item" title="{{$select.selected.name}}">{{$select.selected.name}}</ui-select-match> 
    <ui-select-choices repeat="item in list" refresh="refresh($select.search)" refresh-delay="0"> 
      <small>{{item.name}}</small> 
    </ui-select-choices> 
</ui-select> 

Comme vous pouvez le voir, ui-select angulaire est avec test4 ng-modèle, même difficile, il est pas sur la liste, qui est exactement le comportement que je veux en matière de sélection angulaire. Y at-il un moyen de le faire ou suis-je coincé avec angulaire ui sélectionnez?

+1

Techniquement 'test4' ne figure pas dans la liste même s'il apparaît de cette façon dans' ui-select'. Pouvez-vous ajouter l'objet modèle si ce n'est pas dans la liste des options? '$ scope.list = [{nom:" test1 "}, {nom:" test2 "}, {nom:" test3 "}, $ scope.current_item];' Ou besoin d'une directive générique. – bhantol

Répondre

1

Essayez quelque chose comme ceci ci-dessous.

Nous décorons la directive mdOption et ajoutons le ngModel dans la collection de ngRepeat de l'option md.

fiddle solution with test4 showing as an option

myApp.directive('mdOption',function(){ 
    return { 
    restrict: 'E', 
    priority: 0, 
    require: [ '^^mdSelect', '^^ngModel'], 
    link: function(scope, ele, attr, ctrls) { 
     var repeatExpr = attr.ngRepeat; 
     var optionsModelStr = repeatExpr.match(/[ ]+in+[ ]+(.*?)([ \|]+)/)[1]; 
     var list = scope[optionsModelStr]; 
     var select = ctrls[0]; 
     var ngModel = ctrls[1]; 
     if (ngModel.$modelValue && list.indexOf(ngModel.$modelValue) < 0) { 
      list.push(ngModel.$modelValue); 
     } 

    } 
    } 
}); 

Ce n'est pas un code de prêt pour la production, mais juste une idée.

Modifier: Bien que cela a fonctionné un peu, j'ai décidé d'aller avec un simple $scope.list.unshift($scope.current_item); juste après avoir reçu ma liste. Je pense que c'est plus simple =)

+0

Merci pour vos suggestions, je suis allé avec votre première idée, celle que vous avez commentée dans ma question. Après avoir obtenu ma liste, je fais juste $ scope.list.unshift ($ scope.current_item) ;. Je pense que c'est plus simple =) –