2014-09-17 3 views
1

Я пишу простое приложение для отображения информации о сотруднике (только для чтения). Я хотел бы загрузить информацию только из JSON. Не уверен, что такое соглашение на этом угловом заводе.Одноразовая загрузка данных aync в угловой фабрике - соглашение?

Я знаю, что одно решение - это только файл JSON в файле javascript и загружать его как файл js (но я хотел бы сохранить файл как JSON).

Я думаю, я мог бы также обернуть http-вызов в обещание и соответствующим образом изменить возврат.

Есть ли способ сделать это без изменения возврата? Блокировать нагрузку на сотрудника?

.factory('Employees', ['$http', function($http) { 

    var employees = $http.get('res/employees.json').then(function(response){ 
     return response.data; // This is async so won't return right away 
    }); 

    // This way works (since not async) 
    // var employees = [ 
    // { 
    //  "id": 232, 
    //  "name": "Bob" 
    // }]; 

    return { 
    all: function() { 
     return employees; // This will return empty before employees is loaded 
    } 
    } 
}]); 
+0

Что вы имеете в виду, я хотел бы загрузить информацию только от JSON? Если вы хотите лаодировать только один раз, вам нужно вызвать эту услугу только один раз. –

+0

Нет, вы не можете блокировать. Всегда возвращающее обещание (которое уже может быть разрешено) очень хорошо – Bergi

ответ

4

Это неправильная реализация шаблона обещания. Ваша служба «служащий» должна вернуть обещание, которое будет инициализировано, и затем возвращает то же разрешенное обещание после последующих запросов. Что-то вроде этого:

.factory('Employees', ['$q', '$http', function($q, $http) { 
 

 
    var _deferred = $q.defer(); 
 

 
    $http.get('res/employees.json') 
 
     .success(function(data, status, headers, config) { 
 
      // this callback will be called asynchronously 
 
      // when the response is available 
 

 
      _deferred.resolve(data); 
 

 
     }) 
 
     .error(function(data, status, headers, config) { 
 
      // called asynchronously if an error occurs 
 
      // or server returns response with an error status. 
 

 
      _deferred.reject("Error"); 
 
     }); 
 
    }; 
 

 
    return { 
 
    getEmployees: function(){ 
 
     return _deferred.promise; 
 
    } 
 
    } 
 

 
}]); 
 

 

 
.controller('MyController', ['$scope', 'Employees', function($scope, Employees) { 
 
\t 
 
\t $scope.employees = []; 
 

 
\t $scope.employees = Employees.getEmployees(); 
 

 
}]);

$ scope.employees первоначально будет пустой массив, пока обещание не будет решена. Кроме того, этот код не имеет восстановления ошибок.

+0

Переменная 'employees' в коде OP фактически возвращает обещание. Цель OP с самого начала - загрузить «employee.json» один раз. Ваш код подсказывает, что каждый вызов 'getEmployees()' должен запрашивать для 'employees.json' каждый раз. – ryeballar

+0

Вы можете рассмотреть возможность использования другого обещания ($ q), которое будет разрешено с помощью первоначального запроса $ http, а затем возвращает то же самое разрешенное обещание. Я отредактировал образец кода, чтобы его отразить. –

+1

Нет необходимости использовать '$ q',' $ http.get() 'возвращает обещание, в котором обещание имеет метод' then() ', который также возвращает обещание. – ryeballar

1

Одно из возможных решений, которые могли бы работать для вас, чтобы извлечь данные и manually bootstrap приложение с литерой value или service из принесенных данных. Есть уже построенные решения для такого рода проблем, один называется angular-deferred-bootstrap, а другой - solution Я сделал месяц назад. Оба используют жизненный цикл AngularJS в ручном загрузочном приложении, используя angular.bootstrap(). Обратите внимание, что когда вы вручную загружаете приложение, вам необходимо удалить директиву ng-app.

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