AngularJS Typeahead prepopulation



我有一个typeahead,我想包含一个描述,但存储Id。

我现在正在做这样的事情…

            <input type="text"
                ng-model="SelectedWarehouse.Info"
                typeahead="whs.info for whs in warehouses($viewValue)"
                typeahead-on-select="POHeader.warehouseId=$item.id;"
                class="form-control input-sm "
                id="whs" placeholder="Warehouse"
                ng-disabled="isReadOnly"
                typeahead-wait-ms="500"
                ng-enter="say('hello');" />

我从$作用域得到的jsonp。仓库的功能是这样的:([{"id":"10", "info": "Lakeland (10)")}, {"id":"11", "info": "Denver (11)"}])当然还有适当的json回调信息——这只是一个示例

大意是这样的:当屏幕打开$scope。SelectedWarehouse没有填充任何内容。然后我写了一些东西来预填充SelectedWarehouse,但是必须有一个更好的方法来做到这一点,使用typeahead。

做这件事的正确/好的/最好的(选一个)方法是什么?

另一个问题是不知道何时我的异步调用将实际填充我的对象。承诺的承诺……我想我会尝试使用ng-change函数调用,希望当数据填充ng-change函数会触发…到目前为止,这还不起作用。我还没有完全完成这个实验…

这是我$resource工厂的一部分。我需要做些什么才能获得一个成功的电话?

 ipoModule.factory('SearchRepository', function ($resource) {
    return {
        get: function (txt) {
            return $resource('/api/Search?SearchText=' + txt).query()
        },
        getBuyers: function () {
            return $resource('api/Buyers').query()
        },
        getVendors: function () {
            return $resource('api/Vendors').query()
        },
        getVendorSearch: function (txt) {
            return $resource('api/Vendors/' + txt + "?callback=JSON_CALLBACK").query()
        }, ....

任何想法?

我想这样的东西可能会起作用。您可以将typeahead绑定到一个集合而不是一个方法,并通过从服务器获取值在按下键时更新该集合。您还可以监视集合上的更改,以便知道何时要填充数据。

参见Demo: http://jsfiddle.net/yfz6S/17/

view.html

<div style="margin: 40px;">
<div ng-controller="WarehousesCtrl">
    <pre>query: {{query | json}}</pre>
    <pre>selectedWarehouse: {{selectedWarehouse | json}}</pre>
    <input
        class="form-control input-sm"
        ng-model="query"
        typeahead="warehouse.info for warehouse in warehouses | filter:$viewValue"
        typeahead-on-select="selectedWarehouse = $item;"
        ng-keypress="fetchWarehouses();"
    />
</div>
</div>

controller.js

.controller('WarehousesCtrl', ['$scope', '$http', '$q', function ($scope, $http, $q) {
    $scope.query = null;
    $scope.selectedWarehouse = null;
    $scope.warehouses = [];
    $scope.fetchWarehouses = function() {
        $http.jsonp(
            'http:/mysite.com/mywarehouses?q=' + $scope.query
        ).success(function(data){
            $scope.warehouses = data.warehouses;
        }).error(function(){
            // this request will fail so lets just set some dummy warehouses
            $scope.warehouses = [
                {id:1, info:"Toronto"},
                {id:2, info:"Tobermory"},
                {id:3, info:"Oshawa"},
                {id:4, info:"Ottawa"},
                {id:5, info:"Ajax"},
            ];
        });
    };
}]); 

我自己做了一个解决方案,因为我无法让预填充工作与提前输入。

   <input type="text"
        ng-model="POHeader.SelectedWarehouse"
        typeahead="whs.info for whs in warehouses($viewValue)"
        typeahead-on-select="POHeader.warehouseId=$item.id;"
        class="form-control input-sm "
        id="whs" placeholder="Warehouse"
        ng-disabled="isReadOnly"
        typeahead-wait-ms="500" />

我更改了填充POHeader的视图,以包含一个名为SelectedWarehouse的字段。这是预格式化的typeahead值,看起来与typeahead仓库列表返回的whs.info相同。

这不是理想的,但它工作,我不能浪费更多的时间在这上面。

最新更新