AngularJS BootstrapUI Typeahead with object&选择功能

时间:2013-07-25 10:58:32

标签: angularjs typeahead angular-ui-bootstrap

我正在尝试使用http://angular-ui.github.io/bootstrap/在Angular中实现一个预先输入,其中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>

有什么想法吗?

6 个答案:

答案 0 :(得分:100)

来自http://angular-ui.github.io/bootstrap/的typeahead指令非常非常灵活,有很多方法可以实现所需的功能。我在这里介绍他们中的两个。

首先,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没有多大用处,因为它对点击输入字段而不是匹配弹出作出反应。除此之外,它不会对使用keayboard进行的选择做出反应。

答案 1 :(得分:4)

@ pkozlowski-opensource的优秀解决方案有一个缺点:你不能以这种方式从ng-model属性初始化typeahead,至少如果你想要它显示项目的描述而不是它的代码。

我找到了一种方法来解决这个问题,方法是配置这样的类型:

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

这会将状态对象返回给model属性,可以通过将值设置为适当的对象来初始化该属性:

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

在这里工作小提琴:https://jsfiddle.net/0y3ntj4x/3/

我认为这种情况在typeahead的angular-bootstrap文档中缺失。

答案 2 :(得分:2)

只想添加@ pkozlowski.opensource提供的答案 - jsfiddle.net/jLupa中显示的行为不再适用于Angular的UI-Bootstrap版本0.10.0。见这里:jsfiddle.net/jLupa/87/。我所做的唯一更改是更新到版本0.10.0,您可以看到两个输入框都解析为邮政编码。

答案 3 :(得分:2)

我有类似的问题,

<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 :(得分:0)

这是使用twitter的typeahead:https://github.com/mihaigiurgeanu/lov-typeahead的另一个值列表angularjs指令。您可以将它与引导程序一起使用,但也可以不使用引导程序。

如果你正在使用凉亭,你可以安装它:

bower install lov-typeahead --save

答案 5 :(得分:0)

try the following before saving / validating 

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