Angularjs typeahead angular ui-无法读取未定义的属性“length”

Angularjs typeahead angular ui-无法读取未定义的属性“length”,angularjs,angular-ui,angular-ui-bootstrap,Angularjs,Angular Ui,Angular Ui Bootstrap,我正在为我的应用程序使用Angular ui引导。 我使用typeahead指令 html: 服务: 我确实从服务器接收到数据,但无法在屏幕上显示。在chrome dev tools中运行调试器时,出现下一个错误: 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.

我正在为我的应用程序使用Angular ui引导。 我使用typeahead指令

html:

服务:

我确实从服务器接收到数据,但无法在屏幕上显示。在chrome dev tools中运行调试器时,出现下一个错误:

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)
我已经在多个地方搜索了解决方案,比如,并在bootstrap ui主页中一步一步地遵循说明。
我做错了什么?

在您的服务中,您应该在.success方法的回调函数中返回数据。

我刚刚遇到了这个问题并解决了它。这里的关键是,在angular站点上给出的示例中,它们返回$http结果。这让人很困惑,但归根结底,回报才是最重要的。因此,在您的例子中,您正在将一个变量设置为该返回值,以便永远不会返回该返回。当您的代码以这种方式格式化时,您需要做两件事来更改它: 首先,return语句位于错误的位置。第二,返回值的声明也位于错误的位置。下面是示例中的非工作代码:

.....
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函数中的Addresses值,否则它将继续追加越来越多的值。

我也遇到了这个问题

对我来说,我让我的控制器调用我的服务,然后服务与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按预期工作,不再出现错误

您没有在成功方法中返回数据,但希望在您的控制器中返回数据。我尝试了,但没有帮助。此外,当我调试时,我看到控制器中的数据,它附带了承诺。数据甚至从控制器返回,但我得到了这个错误。你能安装一个plunker吗,它会给你快速的解决方案。我试过了,但没有帮助。此外,当我调试时,我看到控制器中的数据,它附带了承诺。数据甚至是从控制器返回的,但我得到了这个错误。我还看到返回的对象集合。我仍然会犯同样的错误——已经犯了好几个小时了。上面的建议对我不起作用那救了我。谢谢,也救了我!关于承诺回报的经验法则。超级新的承诺。谢谢,帮了我。
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
  });
};