0

У меня есть угловая служба, которая отвечает за представление коллекции сотрудников (которая обычно хранится в базе данных). Я слышал, что это плохой запах кода для выполнения запроса $http.get внутри конструктора класса службы. Мне сказали, что я должен вводить зависимость, которая позволяет вам собирать соответствующие данные, но не то, что я делаю, используя $http, используя инъекцию зависимостей?Считается ли плохой практикой запрашивать данные с сервера в конструкторе службы в Angular?

Так это плохая форма, просто сделать var employees = $http.get('employees') с сервера?

Большое спасибо!

+1

Вы собираетесь время от времени получать сотрудников, или это просто одноразовая работа? \ –

+0

@ TechMa9iac Сейчас один раз. Только один человек может одновременно получить доступ к приложению и CRUD (нет необходимости синхронизировать). Возможно, мне придется продлить его для поддержки нескольких людей в будущем (в зависимости от управления). Кроме того, мне может потребоваться ограничить (в будущем) количество данных, загружаемых на клиентскую сторону. Поэтому мне может потребоваться загрузить больше записей, во время навигации по страницам и поиска по подстроке. – zehelvion

ответ

1

Услуга - это ваша модель, все вызовы на ваш сервер должны быть централизованы в сервисах.

Если я начать с вашего примера, вы должны иметь «EmployeeService» И в нем функцию так: (не забывайте вводить $^и $ HTTP услуг)

me = this; 
me.cacheEmployee = null; 
me.getEmployees = function(){ 
    var deferred = $q.defer(); 
    if(me.cacheEmployee != null){ 
     deferred.resolve(me.cacheEmployee); 
    }else{ 
     $http.get('urlToEmployee').success(function(result){ 
      me.cacheEmployee = result; 
      deferred.resolve(me.cacheEmployee); 
     }); 
    } 

    return deferred.promise; 
}; 
me.forceLoadEmployee = function(){ // after each CreateUpdateDelete operations 
    var deferred = $q.defer(); 
    $http.get('urlToEmployee').success(function(result){ 
     me.cacheEmployee = result; 
     deferred.resolve(me.cacheEmployee); 
    }); 
    return deferred.promise; 
}; 

И в контроллер страницы, которую вы хотите отобразить ваши сотрудники (не забудьте придать EmployeeService)

EmployeeService.getEmployees().then(function(result){ 
    $scope.employees = result; 
}); 

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

Основной документ об обещании: https://docs.angularjs.org/api/ng/service/ $ д

Я надеюсь, что мой ответ будет соответствовать вам.

Имейте славный день!

Редактировать: теперь у вас есть список сотрудников в кеше, вызов будет запущен на сервер только в первый раз.

+0

Это хороший пример, но не обязательно мне действительно помогает. Моя служба должна быть моделью набора сотрудников в том смысле, что я хочу использовать геттеры и сеттеры для определенных полей. Я не хочу каждый раз загружать эти поля. Я хочу загрузить все соответствующие данные один раз (например, @ TechMa9iac), а затем просто позволить контроллеру получить доступ к этим данным. Но это, кажется, шаг в правильном направлении. +1 – zehelvion

+0

Проверьте правильность – Aliz

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

  • Нет связанных вопросов^_^