2014-10-29 2 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(); 
    } 
}); 

Аякса вызов в заводских работ, но $ HTTPS не (оба на заводе, я просто закомментируйте один или другой во время тестирования). Я посмотрел в Google Chrome Дев инструментов и оба вызова возвращают данные в том же формате, но данные $ НТТР не привязан к 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

ответ

4

Аякса JQuery работает, потому что вы толкаете к возвращаемой ссылки.
В угловом обработчике успеха ajax вы перезаписываете переменную, но возвращаемое значение по-прежнему является пустой ссылкой.

Таким образом, чтобы получить угловую $ HTTP функция работает, вы должны выполнить следующие действия в обработчике успеха:

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

Вот и все! Должен ли я подталкивать данные? Я не вижу много примеров, которые используют push out there, поэтому мне интересно, если я собираюсь сделать это неправильно. Толчок в вызове ajax был только там, потому что это пример, который я нашел. Btw, спасибо тонну – steveareeno

+0

@friedi Я думаю, это правильно. Это справочная проблема, вы получаете пустой массив до его назначения. Хотя этот цикл * forEach * исправит, что я не думаю, что это лучший способ. Вам необходимо реорганизовать свой сервис, чтобы воспользоваться обещанием, возвращенным вызовом '$ http'. Вы должны вернуть обещание, а затем вернуть данные в результате успешного вызова. –

+0

Да, это не лучший способ, и я бы сделал это так, как предложил @ m.e.conroy – friedi

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 * в сервисе, а не в контроллере. Контроллер не должен знать, что его обещание состоит только в том, что он хочет данных. –

+0

Я пробовал это, но он возвращает ul с четырьмя (4) li и тире после каждого, но нет данных – steveareeno

Смежные вопросы