2013-07-11 173 views
1

是如何工作的,我有以下的代碼,通過在自動完成指令發送HTTP調用從服務器獲取用戶名:無法弄清楚承諾在角HTTP

var app2 = angular.module('MyModule', []); 

app2.directive('autoComplete', function ($timeout) { 
    return function (scope, iElement, iAttrs) { 
     iElement.autocomplete({ 
      source: function() { 
       //can't call this like so: scope.$apply('getSource'); I get "$apply already in progress error" 
       var names = scope.getSource(); 
       scope.$apply(); 
       console.log(names); 
       return names; 
      }, 
      async:false, 
      minLength: 3, 
      select: function() { 
       $timeout(function() { 
        iElement.trigger('input'); 
       }, 0); 
      } 
     }); 
    }; 
}); 

app2.controller('DefaultCtrl', function($scope, $http) { 
    $scope.getSource = function() { 
     return $http.get('/AccountRequest/GetMatchingEmployeeNames?matchStr=' + $scope.selected) 
      .then(function (data) { 
       var names = []; 
       for (var i = 0; i < data.length; i++) { 
        names.push(data[i].Name); 
       } 
       return names; 
      }); 
    }; 
}); 

我試圖使用在自動完成源代碼中承諾:因爲http方法有延遲,否則我會得到一個空數組。任何人都可以告訴我如何讓它工作?我不知道如何提取名稱陣列出來的諾言功能傳遞給源:

+0

你必須[$超時](http://docs.angularjs.org /api/ng.$timeout)異步http請求..或懶惰加載它我想 – hunt

回答

0
source: function (request,responseCallback) { 
      var names = []; 
      var promise = scope.getSource(); 
      promise.success(function(data){ 
       names = data; 
       console.log(names); 
       responseCallback(names); 
      }).error(function() { 
       console.log("some error occurred"); 
       responseCallback(names); 
      }); 
     }, 

也許

source: function (request,responseCallback) { 
      var names = []; 
      var promise = scope.getSource(); 
      promise.then(function(data){ 
       names = data; 
       console.log(names); 
       responseCallback(names); 
      },function() { 
       console.log("some error occurred"); 
       responseCallback(names); 
      }); 
     }, 

我基於jQuery的自動完成文件它說在寫這源採用傳遞請求和響應回調函數的函數。

查看更多關於一般承諾在這裏是如何工作的:http://docs.angularjs.org/api/ng.$q

看看這是具體如何延長爲$ http服務http://docs.angularjs.org/api/ng.$http

+0

謝謝,但我得到未捕獲TypeError:對象#沒有方法'成功' – Riz

+0

不知道爲什麼會發生,但你有嘗試使用.then而不是.success,我會編輯。 – shaunhusain

+0

在我的app2.controller中的代碼看起來不錯? – Riz