使用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
相关产品推荐
相关产品推荐

