Подтвердить что ты не робот

AngularJS BootstrapUI Typeahead с функцией объекта и выбора

Я пытаюсь реализовать typeahead в Angular с помощью http://angular-ui.github.io/bootstrap/, где поле typeahead отображает полные адреса, но после нажатия на другое поле заполняется только почтовый индекс для этого адреса. Я пытаюсь использовать ng-change или ng-click для этого, но без каких-либо успехов.

http://jsfiddle.net/UxTBB/2/

angular.module('myApp', ['ui.bootstrap'])
    .controller("mainCtrl", function ($scope) {
    $scope.selected = '';
    $scope.states = [{postcode:'B1',address:'Bull ring'},{postcode:'M1',address:'Manchester'}];
    $scope.setPcode = function(site) {
        $scope.selPcode = site.postcode;
        };
});

<div class="container">
    <div ng-controller="mainCtrl" class="row-fluid">
        <form class="row-fluid">
            <div class="container-fluid">
                postcode <input type="text" ng-model="selPcode" />
                typeahead <input type="text"  ng-change="setPcode(site)" ng-model="selected" typeahead="state.address for state in states | filter:$viewValue" />
            </div>
        </form>
    </div>
</div>

Любые идеи?

4b9b3361

Ответ 1

Директива typeahead от http://angular-ui.github.io/bootstrap/ очень гибкая и существует множество способов достижения желаемой функциональности. Я представляю здесь 2 из них.

Во-первых, директива typeahead использует синтаксис, очень похожий на директиву AngularJS select. Это дает вам полный контроль над отображаемой меткой и привязкой данных в качестве значения модели. Так что вы можете просто отобразить адрес в качестве метки и связать почтовый индекс с selPcode напрямую:

<input type="text" ng-model="selPcode" typeahead="state.postcode as state.address for state in states | filter:$viewValue" typeahead-editable="false" />

Ключевым здесь является as часть в выражении typeahead: typeahead="state.postcode as state.address for state in states

Также обратите внимание, что я использую атрибут typeahead-editable="false" для привязки модели только при выборе. Рабочий jsFiddle здесь: http://jsfiddle.net/jLupa/

Другое решение, если вам действительно нужно использовать функцию обратного вызова, - использовать атрибут typeahead-on-select:

<input type="text"  typeahead-on-select="setPcode($item)" ng-model="selected" typeahead="state.address for state in states | filter:$viewValue" />

Он позволяет указать обратный вызов, когда выбрано совпадение. Рабочая скрипка здесь: http://jsfiddle.net/t8BV2/

В качестве последнего примечания: ng-change здесь не будет работать, так как он будет реагировать на любое изменение ввода, пока вы хотите только захватить выбор. ng-click не очень полезен, поскольку он реагирует на нажатие на поле ввода, а не на всплывающее окно совпадений. Вдобавок к этому он не будет реагировать на выбор, сделанный с помощью кейборда.

Ответ 2

Просто хочу добавить ответ, предоставленный @pkozlowski.opensource - поведение, отображаемое в jsfiddle.net/jLupa, больше не работает с версией 0.10.0 Angular UI-Bootstrap. См. Здесь: jsfiddle.net/jLupa/87/. Единственное изменение, которое я сделал, это обновление до версии 0.10.0, и вы можете видеть, что оба окна ввода разрешают почтовый код.

Ответ 3

У меня аналогичная проблема,

<input type="text" ng-model="select" typeahead="a as a.Value for a in countries | filter:{{ Value:$viewValue }} "class="form-control" typeahead-editable="false" >

{ Code: AL,ParentCode: null,Value: Albania,Id: 1206,Name: countries }

но dindt работает с использованием службы таким образом

$scope.countries = []; _services.getcountries(function(result) { $scope.countries = result; });

и была решена с помощью

$scope.countries = []; _services.getcountries(function(result) { $.each(result, function(i, o) { $scope.countries.push(o); }); });

Я надеюсь помочь кому-то

Ответ 4

@pkozlowski-opensource отличное решение имеет один недостаток: вы не можете инициализировать typeahead из свойства ng-model таким образом, по крайней мере, если вы хотите, чтобы он отображал описание элемента, а не его код.

Я нашел способ решить эту проблему, настроив typeahead следующим образом:

<input type="text" ng-model="selected" typeahead="state as state.address for state in states | filter:$viewValue" />

Возвращает объект состояния в свойство модели, которое можно инициализировать, установив значение для соответствующего объекта:

    $scope.selected = {postcode:'M1',address:'Manchester'};

Рабочая скрипка здесь: https://jsfiddle.net/0y3ntj4x/3/

Я думаю, что этот сценарий отсутствует в документации angular -bootstrap для typeahead.

Ответ 5

Это еще один список значений директивы angularjs, которая использует twitter typeahead: https://github.com/mihaigiurgeanu/lov-typeahead. Вы можете использовать его с бутстрапом, но также без бутстрапа.

Если вы используете беседку, вы можете установить ее:

bower install lov-typeahead --save

Ответ 6

try the following before saving / validating 

modelCtrl. $setValidity ('editable', true);