我正在为我的应用程序使用Angular-ui Bootstrap。 我使用了typeahead指令。
HTML :
<input type="text" class="pass_code_input" ng-model="SuppPrefix" Typeahead="ddl_item.Text for ddl_item in getData($viewValue)"/>
控制器
function AutoCompleteCtrl($scope,$http, AutoCompleteSrv) {
$scope.getData = function (prefix) {
AutoCompleteSrv.GetAutoComplete("Supplier", prefix).then(function (result) {
var results_arr = [];
angular.forEach(result.data, function (item) {
results_arr.push({ "Val": item.Val, "Text": item.Text });
});
return results_arr
});
};
};
服务
function AutoCompleteSrv($http) {
var _$http = $http;
self = this;
self.GetAutoComplete = function (DataType, Prefix) {
var promise = _$http({
method: "GET",
url: 'api/AutoComplete',
params: { 'DataType': DataType, 'Prefix': Prefix }
}).success(function (data, status, headers, config) {
}).error(function (data, status, headers, config) {
});
return promise;
};
};
我从服务器接收数据,但我无法在屏幕上显示。当我在chrome dev工具中运行调试器时,我收到下一个错误:
TypeError: Cannot read property 'length' of undefined
at http://localhost:52145/js/libs/ui-bootstrap-tpls-0.11.0.min.js:13:12650
at m.promise.then.u (http://localhost:52145/js/angular/angular.min.js:97:280)
at m.promise.then.u (http://localhost:52145/js/angular/angular.min.js:97:280)
at http://localhost:52145/js/angular/angular.min.js:98:417
at h.$eval (http://localhost:52145/js/angular/angular.min.js:108:482)
at h.$digest (http://localhost:52145/js/angular/angular.min.js:106:62)
at h.$apply (http://localhost:52145/js/angular/angular.min.js:109:287)
at HTMLInputElement.l (http://localhost:52145/js/angular/angular.min.js:133:191)
at http://localhost:52145/js/angular/angular.min.js:31:32
at q (http://localhost:52145/js/angular/angular.min.js:7:386)
我已在多个地方搜索解决方案,例如that,并且还按照bootstrap ui主页中的说明逐步进行操作。 我做错了什么?
答案 0 :(得分:6)
我刚刚遇到这个并解决了它。这里的关键是,在角度站点上给出的示例中,它们“返回”$ http结果。这让人感到困惑,但最终这才是重要的回报。因此,在您的情况下,您要将变量设置为该返回值,以便永远不会返回返回值。当您的代码以这种方式格式化时,您需要做两件事来改变它: 首先是“返回”声明是在错误的地方。第二个是返回值的声明也在错误的位置。以下是示例中的非工作代码:
.....
then(function(res){
var addresses = [];
angular.forEach(res.data.results, function(item){
addresses.push(item.formatted_address);
});
return addresses;
});
以下是我改变它以使其正常工作的方式。
var addresses = []
....
then(function(res){
angular.forEach(res.data.results, function(item){
addresses.push(item.formatted_address);
});
});
return addresses;
如果您不使用“then”而是使用“success”和“error”函数,则会变得更加清晰。然后很明显返回语句应该位于何处以及返回值声明应该在何处。以这种方式编写代码并使其工作是我如何找出问题所在。 请注意,您应该清除“then”函数中的addressses值,否则它将继续追加越来越多的值。
答案 1 :(得分:4)
我也遇到了这个问题。
对我来说,我让我的控制器调用我的服务,然后与api交谈以获取我的数据。
即使获取数据工作(我能够通过console.log看到这一点),网页上没有显示任何内容可供选择,而我正在获取
cannot read property length of undefined
错误。
最后我意识到我需要将我的电话回复给服务。
//controller with code NOT working
vm.getData = function(val, ep) {
myService.getData(val, ep)
.then(function(data){
return data
});
};
//service
this.getData = function(val, ep) {
return $http({
//do http call here
})
.then(function(data) {
//do what's needed with the data here
return data
});
};
使这项工作有效的修复:
//controller with code WORKING
vm.getData = function(val, ep) {
return myService.getData(val, ep)
.then(function(data){
return data
});
};
所以,我只需要将我的调用返回给服务,然后typeahead按预期工作,不再出错!
答案 2 :(得分:0)
在您的服务中,您应该使用.success()
方法的回调函数返回数据。