md-autocomplete调用findUser获数据但下拉为空(无下拉)的修复咨询
我来帮你解决Angular Material md-autocomplete下拉菜单为空的问题,看了你的代码,主要有几个关键问题需要调整:
1. 修正$http响应的数据提取
你在findUser方法里直接返回了data,但$http的then回调参数其实是完整的响应对象,真正的后端返回数据在response.data属性里。如果后端返回的是用户数组,得正确提取这部分:
this.findUser = function (query) { return $http({ method: 'POST', url: apiUrl() + 'user', data: query }).then(function (response) { // 提取后端返回的用户数组,赋值给self.data并返回 self.data = response.data; return self.data; }); };
2. 修复md-item-text的绑定问题
你当前的md-item-text="ctrl.formatUser(item)"有两个问题:一是控制器里根本没定义formatUser方法,二是这个指令需要绑定到能生成字符串的表达式。
如果只是要显示用户的 lastName,直接改成:
md-item-text="item.lastName"
如果需要格式化显示(比如 lastName + firstName),先在控制器里添加格式化方法:
// 在order控制器里添加这个方法 self.formatUser = function(item) { // 根据你的用户对象结构调整这里的属性 return `${item.lastName} ${item.firstName}`; };
然后把html里的md-item-text改成:
md-item-text="ctrl.formatUser(item)"
3. 确保后端返回的是数组
md-autocomplete要求md-items绑定的是一个数组,所以必须确认你的后端接口返回的是用户对象的数组,而不是单个对象或者嵌套的结构。如果后端返回的是类似{code: 200, data: [...]}的结构,那你需要在then回调里提取response.data.data返回。
4. 检查浏览器控制台的报错
打开浏览器开发者工具的控制台,看看有没有Angular相关的报错(比如找不到方法、数据类型错误),这些报错会直接阻止下拉菜单渲染,也是排查问题的关键。
修改后的完整控制器代码片段:
angular.module('orders').controller('order', function ($scope, $http) { var self = this; self.data = null; self.selectedItem = null; self.searchText = null; // 添加格式化方法 self.formatUser = function(item) { return item.lastName; // 按需调整 }; this.findUser = function (query) { return $http({ method: 'POST', url: apiUrl() + 'user', data: query }).then(function (response) { self.data = response.data; return self.data; }); }; // ... 其他代码 });
修改后的md-autocomplete标签:
<md-autocomplete flex="85" md-selected-item="ctrl.selectedItem" md-search-text="ctrl.searchText" md-items="item in ctrl.findUser(ctrl.searchText)" md-item-text="ctrl.formatUser(item)" md-delay="300" md-floating-label="Search supplier representative"> <div layout="row" class="item" layout-align="start center"> <span md-highlight-text="ctrl.searchText">{{item.lastName}}</span> </div> </md-autocomplete>
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

