node package manager
We need your input. Help make JavaScript better: Take the 2017 JavaScript Ecosystem survey »



Manage AngularJS scope load.

NPM version Build status Dependency Status devDependency Status Coverage Status Code Climate

When it comes to load resources in an AngularJS scope, things are very repetitive. Indeed, you have to manage with loading/failed/loaded etc... states all the time.

angular-sf-load allows to do it by simply adding a promise state in your controller/components state load/actions handling. Here is a simple example of how to use it in a simple component:

<!-- Handle all states first load wait -->
<p ng-if="$ctrl.states._all.activating">
<!-- Handle all states first load failure -->
<p ng-if="$ctrl.states._all.failed && !$ctrl.states._all.activated">
  Unrecoverable error: {{ $ctrl.states._all.failed.code }}
<!-- States were loaded once -->
<div ng-if="$ctrl.states._all.activated" ng-repeat="hero in $ctrl.list">
  <h2>{{ }}</h2>
  <!-- Cannot delete an hero twice + giving feedback ;) -->
  <button ng-click="$ctrl.deleteHero(hero)"
    ng-disabled="$ctrl.actions['delete:' + hero._id].loading">
    {{ $ctrl.actions['delete:' + hero._id].loading ? 'Delete' : 'Deleting' }}
<!-- Handle hero list reload wait -->
<p ng-if="$ctrl.states.heros.reloading">
// Example stolen from the AngularJS documentation 
  .module('myUserListComponent', ['sf.load'])
  .component('heroList', {
    template: `path/to/template.html`,
    controller: HeroListController
function HeroListController(sfLoadService, herosService) {
  var ctrl = this;
  ctrl.deleteHero = deleteHero;
  function activate() {
    sfLoadService.loadState($scope, {
      heros: herosService.list(),
      categories: herosService.getCategories(),
    }).then(({ heros, categories }) => {
      ctrl.heros = heros;
      ctrl.categories = categories;
  function deleteHero(hero) {
      'delete:' + hero._id,

You can also see real world usage here.