【问题标题】:How to show results from remote query in Angular-material autocomplete?如何在 Angular-material 自动完成中显示远程查询的结果?
【发布时间】:2015-07-16 12:17:43
【问题描述】:

我正在使用angular-material 编写一个网站,其中我使用auto-complete。在此自动完成 (codepen here) 中,有一个函数从本地演示搜索项数组返回搜索结果,该数组(简化)如下所示:

function querySearch (query) {
    var results = query ? self.repos.filter( createFilterFor(query) ) : self.repos, deferred;
    return results;
}

我现在想编辑此代码,以便在键入每个字母后查询服务器。所以我写了 Angular 代码来查询服务器并返回一个 Promise,as instructed here:

function querySearch (query) {
    return $http.get('/ajax/user/search/' + query).then(function(data){
        console.log(data); // I've got the data here. All fine.
        return data.data;
    });
}

不幸的是,这并没有真正起作用;服务器可以正常查询,但我看到一个空的建议列表,如下所示:

有人知道我该如何解决这个问题吗?欢迎所有提示!

【问题讨论】:

  • 抱歉 - 您的意思是每次您输入字母时都会重新查询自动完成答案吗?
  • @ajmajmajma - 确实是的
  • 示例是这样做的 - material.angularjs.org/latest/#/demo/… ,勾选模拟查询,并禁用缓存
  • @ajmajmajma - 我看到带有 $q 和超时的代码,但我不知道如何编辑它以便可以用它调用我的端点。任何提示都会在这里真正帮助我.. :-)
  • 您是指该示例中的 querySearch 函数吗?它只是设置了一个承诺,所以你几乎可以用实际调用替换 $timeout 。我认为你想要的东西已经内置了:)

标签: javascript angularjs asynchronous callback promise


【解决方案1】:

查看此处的示例并单击关闭模拟查询并禁用查询缓存 - https://material.angularjs.org/latest/#/demo/material.components.autocomplete

如果你真的希望它每次都触发并设置md-min-length="0",请确保禁用缓存md-no-cache="false"

您只想用您的实际查询替换他们必须模拟查询的超时

function querySearch (query) {
  var results = query ? self.states.filter( createFilterFor(query) ) : self.states,
      deferred;
  if (self.simulateQuery) {
    deferred = $q.defer();
    //repalce this
    $timeout(function () { deferred.resolve( results ); }, Math.random() * 1000, false);
    return deferred.promise;
  } else {
    return results;
  }
}

并相应地回报你的承诺。

【讨论】:

  • @Bergi 是的,是的,很好。我只是从他们的示例中复制代码。
【解决方案2】:

一个快速修复方法是将函数返回为:

function querySearch (query) {
    return $http.get('/ajax/user/search/' + query).success(function(data){
        console.log(data); // I've got the data here. All fine.
        return data.data;
    });
}

然后在视图中将调用更改为:

md-items="item in ctrl.querySearch(ctrl.searchText)()"

因此执行你现在返回的函数。

(Codepen 展示解决方案:http://codepen.io/anon/pen/qdyEBy

【讨论】:

  • 我尝试了您的建议,但我在输入时收到了 TypeError: Cannot read property '0' of null。我尝试删除md-items 行末尾的(),但这给我留下了相同的结果:一个空列表。还有什么想法吗?
  • 这是一个很长的机会,但你真的想返回data.data 而不仅仅是data吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多