2014-10-29 128 views
0

我是AngularJS的新手。我似乎無法獲得$ http的工作。我有以下工廠:

app.factory('employeeFactory', function ($http) { 
    var factory = {}; 

    // get data form controller 
    var employees = []; 
    var Url = "../../../Employee/GetEmployees"; 

    // this does not work ---------------------------- 
    $http.get(Url, { params: { term: 'Step' }}). 
     success(function (response, status, headers, config) { 
      employees = response.data 
     }). 
     error(function (response, status, headers, config) { 
      alert(error); 
     }); 

    // this works using JQuery ajax ---------------------------- 
    $.ajax({ 
     url: Url, 
     data: { term: 'Step' }, 
     dataType: "json", 
     type: "GET", 
     error: function (request, status, error) { 
      alert(error); 
     }, 
     success: function (response) { 
      $.each(response.data, function (i, obj) { 
       employees.push({ EmployeeName: obj.EmployeeName, EmployeeNumber: obj.EmployeeNumber }); 
      }); 
     } 
    }); 

    factory.getEmployees = function() { 
     return employees 
    }; 

    return factory; 
}); 

而下面的控制器:

app.controller('EmployeeController', function ($scope, employeeFactory) { 
    $scope.employees = []; 
    init(); 
    function init() { 
     $scope.employees = employeeFactory.getEmployees(); 
    } 
}); 

AJAX調用在工廠工作,但是$ HTTPS不(兩者都是在工廠裏,我只是註釋掉其中一個或另一個測試)。我看着在谷歌Chrome瀏覽器開發工具和兩個調用相同的格式返回數據,但$ HTTP數據沒有被綁定到HTML:

<div class="container"> 
    <h4>This is view 1</h4> 
    Type a name to filter: <input type="text" data-ng-model="employeeSearch" /> 
    <ul> 
     <li data-ng-repeat="employee in employees | filter:employeeSearch | orderBy:'EmployeeName'">{{ employee.EmployeeName }} - {{ employee.EmployeeNumber }}</li> 
    </ul> 
</div> 

這裏是格式工廠返回了兩個電話:

{data: [{EmployeeNumber:123456, EmployeeName:Johnson,Bob},…] 
data: [{EmployeeNumber:123456, EmployeeName:Johnson,Bob},…] 
    0: {EmployeeNumber:123456, EmployeeName:Johnson,Bob} 
     EmployeeName: "Johnson,Bob" 
     EmployeeNumber: "123456" 

我不明白爲什麼,當兩個調用都以相同的格式將數據返回給視圖時,綁定不會發生在$ http方法中。任何幫助表示讚賞

+0

你能保證AJAX調用有你'getEmployees'之前已經完成?我不確定這兩者之間爲什麼會有所不同,但據我所知,您的員工類別中沒有任何內容可以保證數據先被讀取。 – Rup 2014-10-29 13:41:03

回答

4

jQuery的Ajax的工作原理,因爲你推到返回的引用。
在角度ajax成功處理程序中,您覆蓋了變量,但返回值仍然是空引用。

因此,要獲得角度$ HTTP功能的工作,你應該做你的成功處理程序如下:

angular.forEach(response.data, function(value) { 
    employees.push(value); 
}); 
+0

就是這樣!我需要推送數據嗎?我沒有看到很多使用推送的例子,所以我想知道我是否正在解決這個問題。阿賈克斯電話的推動只在那裏,因爲這是我發現的例子。順便說一句,感謝噸 – steveareeno 2014-10-29 13:55:06

+0

@friedi我認爲是正確的。它是一個參考問題,您在檢索空數組之前可以分配它。雖然這* forEach *循環會糾正,我不認爲這是最好的方式。您需要重構您的服務以利用'$ http'調用返回的諾言。您應該返回承諾,然後在成功調用中返回數據。 – 2014-10-29 13:55:58

+0

是的,這不是最好的方式,我會這樣做@ m.e.conroy建議 – friedi 2014-10-29 13:57:07

0

使用此代碼:

服務:

app.factory('employeeFactory', function ($http) { 
    var employees = []; 
    var Url = "../../../Employee/GetEmployees"; 
    var factory = { 
    getEmp:function(){ 
     return $http.get(Url, { params: { term: 'Step' }}) 
    } 
    } 
    return factory; 
}); 

控制器:

app.controller('EmployeeController', function ($scope, employeeFactory) { 
    $scope.employees = []; 

    function init() { 
     employeeFactory.getEmp().then(function(data){ 
     $scope.employees=data; 
     }) 
     .catch(function(err){ 
     console.log(err); 
     }) 
    } 
    init(); 
}); 
+0

這是更好的,但你可以在服務而不是控制器中執行* success *和* error *鏈接函數。控制器不應該知道它只是希望獲得數據的承諾。 – 2014-10-29 14:01:56

+0

我試過這個,但是它會返回一個帶有四(4)個李和每個後面的破折號的ul,但是沒有數據 – steveareeno 2014-10-29 14:21:18