templateurl parameter directives directivas custom compile javascript angularjs angularjs-directive angularjs-scope angularjs-service

javascript - parameter - directivas angularjs



En mi fábrica de servicio busco un gran conjunto de datos, quiero persistir y verificar su existencia para evitar llamarlo de nuevo (2)

Puede mover la declaración de allNames fuera de la declaración de devolución de su servicio, y luego verificar si es null antes de consultar la API. De esa forma, allNames sirve como un caché para los resultados de la llamada API interna.

Además, tenga en cuenta que sería mejor si devuelve una promesa de getMatchingNames , de lo contrario, su servicio siempre devuelve una matriz en blanco de inmediato, que luego se llena más tarde, después de que se complete la llamada API interna. Si devuelve una promesa, deberá cambiar la forma en que está configurando displayNames en su inputStarted eventos inputStarted :

MedicationMatchingNamesFactory.getMatchingNames.then(function(matches) { $scope.meds.displayNames = matches; });

y su servicio podría verse así:

.factory(''MedicationMatchingNamesFactory'', [''$http'', ''$q'', ''MedicationDisplayNamesFactory'', function MedicationMatchingNamesFactory($http, $q, MedicationDisplayNamesFactory) { var allNames = null; function getMatches(inputValue, list){ var matches = []; angular.forEach(list, function(value, key){ if(value.indexOf(inputValue) !== -1){ matches.push(value); } }); return matches; } return { getMatchingNames: function(inputValue){ var deferred = $q.defer(); if (allNames !== null) { deferred.resolve(getMatches(inputValue, allNames)); } else { MedicationDisplayNamesFactory.getDisplayNames().then( function(response){ // this is the large dataset - now as array allNames = response.data.displayTermsList.term; deferred.resolve(getMatches(inputValue, allNames)); }, function(reason){ deferred.reject(reason); } ); } return deferred.promise; } }; }])

Mi servicio (fábrica) realiza una llamada API y asigna datos de respuesta a una variable:

.factory(''MedicationMatchingNamesFactory'', [''$http'', ''$q'', ''MedicationDisplayNamesFactory'', function MedicationMatchingNamesFactory($http, $q, MedicationDisplayNamesFactory){ return { getMatchingNames: function(inputValue){ var matches = []; // I thought this may be set as null so I''m able to // differentiate it from the below array form (when exists) var allNames = null; MedicationDisplayNamesFactory.getDisplayNames().then( function(response){ // this is the large dataset - now as array var allNames = response.data.displayTermsList.term; angular.forEach(allNames, function(value, key){ if(value.indexOf( inputValue ) !== -1){ matches.push(value); } }); } ); return matches; } }; return MedicationMatchingNamesFactory; }])

Estoy usando la directiva "ui-select" de Angular-UI para buscar dentro de este gran conjunto de datos en función de la cadena ingresada.

En mi controlador:

$scope.$on(''inputStarted'', function(event, value){ if(value.length > 3){ $scope.meds.displayNames = MedicationMatchingNamesFactory.getMatchingNames(value); console.log($scope.meds.displayNames); } });

Ahora, para evitar consultar la API (en realidad llamar a otro servicio que contiene la llamada a API) cada vez que el número de caracteres de entrada es mayor que 3, creo que sería genial si puedo verificar si allNames es null (vacío, llame a la API) o es una array (omita la llamada, solo use eso).

Traté de mover la parte angular.forEach fuera de la llamada y lo prometí, pero luego, obviamente, no pasó nada porque aún no se resolvió en la primera ejecución.

¿Hay alguna manera de verificar este conjunto de datos de allNames antes de hacer la llamada a la API?


En realidad, la solución a este problema es muy simple: acabo de ir con la sessionStorage que parece ajustarse perfectamente a mis necesidades en este caso, ya que necesito el gran conjunto de datos persistido solo para esta sesión y no importa si se pierde en la siguiente . El objetivo es evitar buscarlo más de una vez, es decir, más de lo necesario, ya que es poco probable que los valores internos cambien durante esa sesión.