Невозможно использовать ввод пользовательского интерфейса Angular с запросом автозаполнения Yammer

Я создаю приложение AngularJs с помощью Yammer JS SDK. Текущее приложение вызывает службу API отдыха автозаполнения Yammer и использует библиотеку Typeahead Angular-UI Bootstrap для заполнения результатов автозаполнения на веб-странице. К сожалению, я получаю ошибку длины из библиотеки Typeahead, поскольку она пытается найти массив в возвращаемой функции. Я знаю, как вернуть массив результатов как обещание, используя службу AngularJS $http, но я не мог понять, как реализовать то же самое, используя вызов yam.platform.request. Ниже приведен исходный код метода, который я вызываю для автоматического завершения.

 $scope.autoComplete = function (val) {
   var users = []; 
   yam.platform.getLoginStatus(
      function(response) {
       if(response.authResponse){
           return yam.platform.request({
           url: "autocomplete/ranked", 
           method: "GET",
           data: {
                  "models":"user:15",
                  "prefix": val 
           },
          success: function (response) {
                     if (response.user) {
                         users = [];
                         angular.forEach(response.user, function(user){
                          users.push(user);
                     });
                     return users; 
                    }; 
          },
          error: function (error) {
                    users = [];
                    console.error(error);
                    return users; 
                 }
          });

       }
    });
   };

Я получаю следующую ошибку в ответе,

 TypeError: Cannot read property 'length' of undefined

person prasad1250    schedule 29.05.2014    source источник


Ответы (1)


Я нашел решение вышеуказанной проблемы, используя промисы angularjs. Это обходной путь для вышеуказанной проблемы.

    $scope.autoComplete = function(val) {
            var deferred = $q.defer();
            $scope.autoCompleteSearch(val, deferred, function(users){
                deferred.resolve(users);
            });
            return deferred.promise;
        };

        $scope.autoCompleteSearch = function (val, deferred, callback) {
              return yam.platform.getLoginStatus(
                function(response) {
                  if(response.authResponse){
                         return yam.platform.request({
                            url: "autocomplete/ranked", 
                            method: "GET",
                            data: {
                              "models":"user:15",
                              "prefix": val        
                            },
                            success: function (response) {
                                 var users = []; 
                                if (response.user) {
                                    users = [];
                                    angular.forEach(response.user, function(user){
                                        users.push(user);
                                    });
                                    callback(users); 
                                };                       
                            },
                            error: function (error) {
                              var users = [];
                              console.error(error);
                              callback(users); 
                            }
                    });

                  }
            });
        };

Надеюсь, это поможет всем, у кого есть эта проблема.

С уважением.

person prasad1250    schedule 29.05.2014