You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用md-autocomplete时出现Then is undefined错误提示的问题

排查md-autocomplete「Then is undefined」错误原因及解决方法

嘿,我一眼就瞅出你代码里的问题啦,就是两个小疏忽导致了这个报错:

错误原因

  • 没正确创建deferred实例:你写的var deferred = $q.defer;少了关键的括号!$q.defer是个方法,必须调用它(也就是$q.defer())才能生成可用的deferred对象,现在你只是把方法本身赋值给了变量,根本没有resolve方法可以调用,后续逻辑自然会出问题。
  • querySearch函数没返回Promise:md-autocomplete要求querysearch函数必须返回一个Promise对象,这样组件才能通过.then()处理异步结果。你现在的函数没有返回任何值,组件找不到then方法,就会抛出「Then is undefined」的错误。

修正后的完整代码

myapp.controller('myctrl', function ($timeout, $q) { 
  var self = this; 
  self.uom = loaduom(); 
  self.selecteditem = null; 
  self.searchtext = null; 
  self.querysearch = searchuom; 

  function searchuom(query) { 
    var result = query ? self.uom.filter(createfilter(query)) : self.uom; 
    // 修正1:调用$q.defer()创建deferred实例
    var deferred = $q.defer(); 
    $timeout(function () { 
      deferred.resolve(result); 
    }, Math.random() * 1000, false); 
    // 修正2:返回deferred对应的promise对象
    return deferred.promise;
  } 

  function loaduom() { 
    var itms = ' Pcs ,Pak ,Bag ,Box ,Ltr ,Mltr ,c.m. ,m.m ,mtr ,kg ,gms ,sqft '; 
    // 补全split逻辑,分割后去除每个选项的空格
    return itms.split(',').map(item => item.trim());
  }

  // 补充你未完成的createfilter函数实现
  function createfilter(query) {
    var lowercaseQuery = query.toLowerCase();
    return function filterFn(item) {
      return item.toLowerCase().includes(lowercaseQuery);
    };
  }
});

另外我还帮你补全了loaduom里没写完的split逻辑,以及补充了createfilter函数的实现,这样整个组件的逻辑就能正常运行啦。

内容的提问来源于stack exchange,提问作者vinayak vk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:24:37