【问题标题】:Angular UI typeahead drop down does not appearAngular UI typeahead 下拉菜单不出现
【发布时间】:2014-03-25 18:49:02
【问题描述】:

我将Angular UI's typeahead 与Web Api 结合使用来加载搜索结果。 我的 Angular 是 1.2.2 版,引导程序是 3.1.0。我应该提到我也在使用打字稿。

当我在搜索框中输入内容时,我希望带有建议的下拉菜单会从输入中掉下来。当我检查控制台时,我看到了我返回的数据,问题是没有出现下拉菜单来显示它。

这是我的 HTML + angular 指令:

<div class="input-group">
                <input type="text" class="form-control" placeholder="Search" ng-model="selected"
                       data-typeahead="searchResult as searchResult for searchResult in search($viewValue) | filter:$viewValue" >
                <div class="input-group-btn">
                    <button class="btn btn-default" type="submit" ng-click="search(Text)"><i class=" glyphicon glyphicon-search"></i></button>
                </div>
            </div>

这是位于我的控制器中的 js 函数:

$scope.search = function (criteria) {
                    controller.dataService.search($scope.employeeId, criteria, function (data) {
                        $scope.searchResult = data;
                });

这是我的数据服务中的搜索功能。

export interface ICommonDataService extends IBaseDataService {
    search(employeeId: string, criteria: string, successCallback: (data: SearchResult) => any);
}

dataservice.ts 信息:

export class DataServicBase {
    public httpService: ng.IHttpService;
    public serviceBase = '/services/api';

    public static $inject = [
        '$http'
    ];

    constructor($http: any) {
        this.httpService = $http;
    }
}

    export class CommonDataService extends DataServicBase implements ICommonDataService {
    public serviceUrl = this.serviceBase + '/common';

    search(employeeId: string, criteria: string, successCallback: (data: SearchResult) => any) {
        this.httpService.get(this.serviceUrl + '/' + employeeId + '/search/' + criteria)
            .success(function (data) {
                successCallback(data);
            });
    }
}

这就是 SearchResult 的样子:

// Class
export class SearchResult {
    // Constructor
    constructor(
        public Employees: Employee[],
        public Filters: Employee[],
        public Projects: Project[]
        ) {
    }
}

我得到的错误是:

Error: matches is undefined
.link/getMatchesAsync/<@https://web.plank.local/Scripts/ui-bootstrap-tpls-0.10.0.js:3186
qFactory/defer/deferred.promise.then/wrappedCallback@https://web.plank.local/scripts/angular.js:10655
qFactory/defer/deferred.promise.then/wrappedCallback@https://web.plank.local/scripts/angular.js:10655
qFactory/ref/<.then/<@https://web.plank.local/scripts/angular.js:10741
$RootScopeProvider/this.$get</Scope.prototype.$eval@https://web.plank.local/scripts/angular.js:11634
$RootScopeProvider/this.$get</Scope.prototype.$digest@https://web.plank.local/scripts/angular.js:11479
$RootScopeProvider/this.$get</Scope.prototype.$apply@https://web.plank.local/scripts/angular.js:11740
textInputType/listener@https://web.plank.local/scripts/angular.js:15739
jQuery.event.dispatch@https://web.plank.local/scripts/jquery-2.1.0.js:4371
jQuery.event.add/elemData.handle@https://web.plank.local/scripts/jquery-2.1.0.js:4057
aM@https://cdn.qbaka.net/reporting.js:78

https://web.plank.local/scripts/angular.js
Line 9159

【问题讨论】:

  • 向我们展示您的 JavaScript 代码(服务)。但是快速查看您的示例,您似乎没有从您的 search 方法返回任何内容。
  • @pkozlowski.opensource 我已经更新了这个问题。如果您需要更多信息,请告诉我,以防我错过了上面的内容。
  • 我们需要查看controller.dataService 中的代码——JavaScript 中的dataService 是什么,它是如何编写的?
  • @pkozlowski.opensource 我已包含数据服务信息。

标签: javascript angularjs twitter-bootstrap angularjs-directive bootstrap-typeahead


【解决方案1】:

主要问题是您希望预先输入的数据列表不是列表(或未被填充)。 在我看来,控制器中的函数 search 应该返回数据,而这只是一个承诺。您可以尝试 datareturn,并添加一个 limitToFilter 使其更加健壮。而不是将它放在共享的 scope.searchResult 中,您的 typeahead 根本没有拾取它。

【讨论】:

  • 我会尝试一些编辑,然后告诉你这是怎么回事。
  • 嗨,很抱歉花了这么长时间。有点偏离项目。我最终使用了带有 then 函数的 $http.get。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多