typeahead angular ui - 无法读取undefined属性'length'

时间:2014-07-06 11:15:40

标签: angularjs angular-ui angular-ui-bootstrap

我正在为我的应用程序使用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主页中的说明逐步进行操作。 我做错了什么?

3 个答案:

答案 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()方法的回调函数返回数据。