2015-04-07 2 views
27

Я использую поле выбора из ui-select. Все работает нормально, но я хочу разрешить вводимый вручную текст и не хочу ограничивать пользователя из значений, доступных в списке. Если я набираю текст, он правильно фильтрует мой список. Но когда я не нажимаю на элемент и не перехожу к следующему полю, мой текст будет отброшен.Разрешить вводимый вручную текст в ui-select

Любые идеи?

Спасибо и уважением, Alex

Я не хочу, чтобы показать свой код, потому что я думаю, что это не правильно, но это было предложено:

<ui-select ng-model="formData[field.id].selected" theme="bootstrap"> 
    <ui-select-match placeholder="{{ lists[field.id].placeholder }}">{{$select.selected.text}}</ui-select-match> 
    <ui-select-choices repeat="item in lists[field.id].list | filter: $select.search"> 
     <div ng-bind-html="item.text | highlight: $select.search"></div> 
    </ui-select-choices> 
</ui-select> 

Данные хранятся в formData[field.id].selected. field.id - номер текущего отображаемого поля (я динамически генерирую свою форму). Предположим, что он сохраняет уникальную ценность int.

Редактировать 08.04.2015 Мое решение: я узнал, что кажется, как будто нет никакого эквивалента в C# ComboBox. Поэтому я пошел вперед и использовал два отдельных поля. Это не то, что я хотел, но он работает сейчас:

<ui-select ng-model="formData[field.id].selected" theme="bootstrap"> 
    <ui-select-match placeholder="{{ lists[field.id].placeholder }}">{{$select.selected.text}}</ui-select-match> 
    <ui-select-choices repeat="item in lists[field.id].list | filter: $select.search"> 
     <div ng-bind-html="item.text | highlight: $select.search"></div> 
    </ui-select-choices> 
</ui-select> 
<?php echo __('Create a new element if value is not in list'); ?> 
<div class="input-group"> 
    <span class="input-group-addon"> 
     <input type="checkbox" ng-model="disabled[field.id]"> 
    </span> 
    <input type="text" value="" ng-disabled="!disabled[field.id]" class="form-control" ng-model="formData[field.id].newValue" /> 
</div> 
+1

Ну, я не уверен, почему меня ниспровергают. Было бы достаточно, если бы кто-нибудь мог указать мне на какую-то документацию. В ui-select github приведены некоторые примеры, но ни один редактируемый текст отсутствует. – AlexWerz

+0

Можете ли вы поделиться каким-то кодом? – nalinc

+0

Я не хотел делиться кодом, потому что я уверен, что это неверно. Я добавлю некоторые, если это поможет. – AlexWerz

ответ

34

здесь решение:

HTML -

<ui-select ng-model="superhero.selected"> 
    <ui-select-match placeholder="Select or search a superhero ...">{{$select.selected}}</ui-select-match> 
    <ui-select-choices repeat="hero in getSuperheroes($select.search) | filter: $select.search"> 
    <div ng-bind="hero"></div> 
    </ui-select-choices> 
</ui-select> 

CONTROLLER -

$scope.getSuperheroes = function(search) { 
var newSupes = $scope.superheroes.slice(); 
    if (search && newSupes.indexOf(search) === -1) { 
    newSupes.unshift(search); 
    } 
    return newSupes; 
} 

Вот CodePen solution.

7

Вы можете использовать мечения атрибут , как описано в документации: https://github.com/angular-ui/ui-select/wiki/ui-select

<ui-select multiple tagging tagging-label="(custom 'new' label)" ng-model="multipleDemo.colors"> 
... 
</ui-select> 
+1

Большое вам спасибо за то, что указали мне на wiki. Я искал документацию или примеры, но полностью пропустил wiki. Однако тегирование не то, что мне нужно. Маркировка работает только при использовании 'multiple'. Я хочу выбрать, который действует как выбор и ввод текста в одном элементе. Если ваш текст уже находится в списке, вы можете щелкнуть по нему, если не будет сохранен ваш текст. – AlexWerz

+0

@AlexWerz: У вас есть решение? Если да, можете ли вы поделиться им. Благодарю. –

+0

Не жалко. Я использовал решение, указанное в приведенном выше редактировании. Но нет реального эквивалента C# Combobox. Я переключил некоторые из моих графических интерфейсов на angular.js, у которого есть еще несколько вариантов и возможностей. Может быть, вы тоже должны это посмотреть. – AlexWerz

13

Я думаю, что я нашел способ позволяют пользователю создавать новые записи. Используйте «на выбор» приписывать передать функцию, которая принимает $ выбрать в качестве параметра, как показано ниже:

<ui-select ng-model="person.selected" 
     theme="select2" 
     on-select="peopleSel($select)" 
     tagging 
     reset-search-input="false" 
     > 

    <ui-select-match placeholder="Enter a name...">{{$select.selected.name}}</ui-select-match> 
    <ui-select-choices repeat="sel in people | filter: {name: $select.search}"> 
    <div ng-bind-html="sel.name | highlight: $select.search"></div> 
    </ui-select-choices> 
    </ui-select> 

Затем создать функцию, которая добавляет новую запись, когда переменная clickTriggeredSelect ложна:

$scope.peopleSel= function(sel) { 
    if (sel.search && ! sel.clickTriggeredSelect) { 
    if (! sel.selected || sel.selected.name != sel.search) { 
     //Search for an existing entry for the given name 
     var newOne= personSearch(sel.search); 
     if (newOne === null) { 
     //Create a new entry since one does not exist 
     newOne= { name: sel.search, email: 'none', country: 'unknown' }; 
     $scope.people.push(newOne); 
     } 
     //Make the found or created entry the selected one 
     sel.selected= newOne; 
    } 
    } 
    sel.search= ''; //optional clearing of search pattern 
}; 

Обратите внимание, что определение personSearch не приводится здесь. Также этот подход тестирования clickTriggeredSelect может использоваться, чтобы позволить пользователю отменить выбор поля, если предпочтительной является пустая запись.

ПВХ

+0

ui-select v0.19 ввел новую директиву '' uis-open-close' (https://github.com/angular-ui/ui-select/wiki/uis-open-close). Если вы помещаете функцию там, а не в 'on-select', записи будут добавляться даже при размытии. – Terminus

3

Я раздвоенный пользовательский интерфейс, выберите проект, чтобы эту функцию через позволяют свободных от текста атрибута

<ui-select allow-free-text="true" ng-model="ctrl.freeTextDemo.color2" theme="bootstrap" style="width: 800px;" title="Choose a color"> 
    <ui-select-match placeholder="Select color...">{{$select.selected}}</ui-select-match> 
    <ui-select-choices repeat="color in ctrl.availableColors | filter: $select.search"> 
     <div ng-bind-html="color | highlight: $select.search"></div> 
    </ui-select-choices> 
</ui-select> 

Вот plnker

Пока мой запрос тянуть не принимается угловое разрешение ui, вы можете получить сборку ui-select, которая включает мой патч на my own repo

+0

Мне нравится это решение. Каков статус/комментарии вашего запроса на тягу? Не удалось найти его на GitHub. – Melon

+0

К сожалению, команда ui-select отклонила мой PR, вместо этого они хотят использовать свою систему тегов. Вот ссылка PR: https://github.com/angular-ui/ui-select/pull/1659 – aixki

+0

Было бы лучше, если бы вы сделали для этого самостоятельную директиву. –

Смежные вопросы