2015-01-30 5 views
2

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

app.controller('AppController', [ '$rootScope', '$http', function ($rootScope,$http) { 

$rootScope.empty = 0; 
$rootScope.products = []; 
$rootScope.lastId = 0; 
$rootScope.getLastID = function() { 
$http.get("app_dev.php/api/products?op=getLastId").success(function (data) { 
$rootScope.lastId = data.lastId; 
}); 
}; 
$rootScope.getProducts = function() { 
    if ($rootScope.empty === 0) { 
    for (i = 1; i < 100; i++) { 
    $http.get("app_dev.php/api/product/" + i).success(function (data) { 
    $rootScope.products.push(data); 
    }); 
    } 
    } 
$rootScope.empty.productos = 1; 
    }; 
} 

Я сделал это с заводом и услугами, но не работаю.

app.factory('lastProduct', ['$http', function lastProductFactory($http) { 
this.lastId; 
var getLast = function() { 
    $http.get("app_dev.php/api/products?op=getLastId").success(function (data) { 
    lastId = data.lastId; 
}); 

        return lastId; 
       }; 

       var lastProduct = getLast(); 

       return lastProduct; 
      }]); 

     function productList($http, lastProduct) { 
      this.empty = 0; 
      this.lastId = lastProduct(); 
      this.products = [] 

      /*this.getLast = function() { 
       lastId = lastProduct(); 
      };*/ 
      this.getProducts = function() { 
       if (empty === 0) { 
        for (i = 1; i < lastId; i++) { 
         $http.get("app_dev.php/api/product/" + i).success(function (data) { 
          products.push(data); 
         }); 
        } 
       } 
       empty = 1; 
       return products; 
      }; 

     } 

     app.service('productsList', ['$http', 'lastProduct' , ProductsList]); 

ответ

0

Создание множества небольших запросов http-запросов не похоже на хорошую идею. Но использование фабрики для хранения массива данных, которые будут использоваться через контроллеры, будет выглядеть примерно так. Чтобы использовать фабрику, вам нужно вернуть открытую api. (Этот стиль используется при использовании сервиса. Я предлагаю googling разные, но я предпочитаю заводы). И если вам нужно предупредить другие контроллеры, которые изменили данные, вы можете использовать события.

angular 
    .module('myApp') 
    .factory('myData', myData); 

function myData($http, $rootScope) { 
    var myArray = [], lastId; 

    return { 
     set: function(data) { 
      $http 
       .get('/path/to/data') 
       .then(function(newData) { 
        myArray = newData; 

        $rootScope.$broadcast('GOT_DATA', myArray); 
       }) 
     }, 
     get: function() { 
      return myArray 
     },  
     getLast: function() { 
      $http 
       .get('/path/to/data/last') 
       .then(function(last) { 
        lastId = last; 

        $rootScope.$broadcast('GOT_LAST', lastId); 
       }) 
     } 
    } 
} 

А затем с любого контроллера вы можете ввести завод и получить и установить данные по своему усмотрению.

angular 
    .module('myApp') 
    .controller('MainCtrl', MainCtrl); 

function MainCtrl($scope, myData) { 
    $scope.bindableData = myData.get(); // get default data; 

    $scope.$on('GOT_DATA', function(event, data) { 
     $scope.bindableData = data; 
    }) 
} 

Надеюсь, это поможет. Дайте знать, если у вас появятся вопросы.

+0

Могу ли я поставить логику $ http внутри метода set на myData()? – user92083452

+0

Да работает нормально. Спасибо. Вы делаете это так просто. – user92083452

+0

Но где я должен поместить $ http.get («app_dev.php/api/products? Op = getLastId»). Успех (функция (данные) { $ rootScope.lastId = data.lastId; }); – user92083452

1

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

вы можете сделать

angular.module('app',['dependencies']). 
config(function(){ 
    //configs 
}) 
.run(function(service){ 
    service.gerValue() 
}) 

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

+0

, но как я получаю значения, полученные в функции .run? Должен ли я использовать $ rootScope? – user92083452

+0

вы уже пользуетесь услугой, вы можете хранить их там или передавать в другое место, где они есть –

0

Я сделал это, но не работал. Значение rootScope не определено, когда метод set вызывается с некоторого контроллера. http://imgur.com/qEl5WV5 Но используя 10 вместо rootscope общей http://imgur.com/t6wB3JZ я мог видеть, что rootScope общая вар прибыть до других ... (app_dev.php/API/PRODUCTOS? Оп = ultimaIdProductos) против (app_dev.php/API/Producto/x)

  var app = angular.module('webui', [$http, $rootScope]); 

      app.run (function ($http, $rootScope){ 

       $http.get("app_dev.php/api/products?op=getLastId").success(function (data) { 
        $rootScope.total = data.ultima;      
       }); 

      }); 

       function myData($http, $rootScope) { 
        var myArray = []; 

        return {    
         set: function() { 
          console.log($rootScope.total); 
          for (i = 1; i < $rootScope.total; i++) { 
           $http.get("app_dev.php/api/product/" + i).success(function (data) { 
            myArray.push(data); 
           }) 
          } 

         }, 
         get: function() { 
          return myArray; 
         } 
        } 
       } 

    app.controller('AppController', ['$http', '$rootScope', 'myData', function ($http, $rootScope, myData) { 

       $rootScope.productos = []; 

       $rootScope.getProductos = function() { 

        console.log($rootScope.total); 
        myData.set(); 
        $rootScope.productos = myData.get(); 


       }; 

}]); 
Смежные вопросы