当我尝试使用promise从AngularUI-Bootstrap获取一个预先输入值时,我收到以下错误。
TypeError: Cannot read property 'length' of undefined
at http://localhost:8000/static/js/ui-bootstrap-tpls-0.6.0.min.js:1:37982
at i (http://localhost:8000/static/js/angular.min.js:79:437)
at i (http://localhost:8000/static/js/angular.min.js:79:437)
at http://localhost:8000/static/js/angular.min.js:80:485
at Object.e.$eval (http://localhost:8000/static/js/angular.min.js:92:272)
at Object.e.$digest (http://localhost:8000/static/js/angular.min.js:90:142)
at Object.e.$apply (http://localhost:8000/static/js/angular.min.js:92:431)
at HTMLInputElement.Va.i (http://localhost:8000/static/js/angular.min.js:120:156)
at HTMLInputElement.x.event.dispatch (http://localhost:8000/static/js/jquery-1.10.2.min.js:5:14129)
at HTMLInputElement.v.handle (http://localhost:8000/static/js/jquery-1.10.2.min.js:5:10866)
我的HTML标记是:
<input type="text" class="form-control" id="guestName" ng-model="name" typeahead="name for name in getTypeaheadValues($viewValue)">
使用getTypeaheadValues
函数执行以下操作:
$scope.getTypeaheadValues = function($viewValue)
{
// return ['1','2','3','4'];
$http({
method: 'GET',
url: 'api/v1/person?name__icontains=' + $viewValue
}).error(function ($data) {
console.log("failed to fetch typeahead data");
}).success(function ($data) {
var output = [];
$data.objects.forEach(function (person)
{
output.push(person.name);
});
console.log(output);
return output;
});
}
我不明白AngularUI-Bootstrap抱怨未定义的内容。如果我删除最顶层return
上的评论,则值显示正常。 console.log
中的success
输出也会返回我在数组中所期望的所有值。
我错过了哪些会导致AngularUI-Bootstrap看不到返回的数组?
答案 0 :(得分:22)
这个问题有两个问题。
首先是我没有返回promise事件($http
调用)。缺少return语句(如@tobo指出的那样)是直接导致错误的原因。我需要回复承诺,而不是数组。
第二个是我需要使用.then
而不是.success
来获取AngularUI-Bootstrap来获取结果。
我遇到了以下问题: How to tie angular-ui's typeahead with a server via $http for server side optimization?
更新了我的函数调用以下内容:
$scope.getTypeaheadValues = function($viewValue)
{
return $http({
method: 'GET',
url: 'api/v1/person?name__icontains=' + $viewValue
}).then(function ($response) {
var output = [];
console.log($data);
$response.data.objects.forEach(function (person)
{
output.push(person.name);
});
console.log(output);
return output;
});
}
答案 1 :(得分:2)
$ scope.getTypeaheadValues未返回任何数组。它返回null,因为 你的return语句在回调函数“success”中,称为异步。
也许这会奏效:
$scope.getTypeaheadValues = function($viewValue)
{
var output = [];
$http({
method: 'GET',
url: 'api/v1/person?name__icontains=' + $viewValue
}).error(function ($data) {
console.log("failed to fetch typeahead data");
}).success(function ($data) {
$data.objects.forEach(function (person)
{
output.push(person.name);
});
console.log(output);
});
return output;
}
答案 2 :(得分:-2)
$scope.getTypeaheadValues = function($viewValue)
{
var someOutput="";//return something
$http({
method: 'GET',
url: 'api/v1/person?name__icontains=' + $viewValue
}).error(function (data) {
console.error(data);
}).success(function (data) {
console.log(data);//Do whatever you want
});
return someOutput;
}
//缺少return语句