Как предварительно кэшировать содержимое URL-адреса в ionic 1/angular 1?

Я довольно новичок в ionic и работаю над приложением, в котором вы загружаете кучу категорий, за которыми следует список элементов в категории, и когда вы нажимаете на элемент в категории, загружается документ, содержащий контент, который в основном является изображением. В настоящее время все загружается нормально, но я хотел бы предварительно загрузить содержимое в тот момент, когда моя категория видна, поэтому, даже если я выйду в автономный режим, я смогу щелкнуть любой элемент в списке категорий и загрузить соответствующий документ. Я искал в Интернете, но не смог найти ничего, кроме локального хранилища, которое кэширует данные после того, как вы его посетили, а не раньше. Есть ли способ предварительно загрузить или предварительно кэшировать контент?

Вот мой код для контроллеров:

 angular.module('starter.controllers', ["utility.services"])
  .directive("bindCompiledHtml", ["$compile", "zoomPerOrientation", function($compile, zoomPerOrientation) {
    return {
      template: '<div></div>',
      scope: {
        rawHtml: '=bindCompiledHtml'
      },
      link: function(scope, elem, attrs) {
        scope.$watch('rawHtml', function(value) {
          if (!value) return;
          var newElem = $compile(value)(scope.$parent);
          elem.contents().remove();
          zoomPerOrientation.zoomTo('docScroll');
          elem.append(newElem);
          elem.bind("click", function(e) {
            e.stopPropagation();
            e.preventDefault();
            if (e.target.tagName === 'A') {
              window.open(encodeURI(e.target.href), '_system', "presentationstyle=fullscreen,closebuttoncaption=close,location=no,transitionstyle=fliphorizontal");
              return false;
            } else if (e.target.parentNode.tagName === 'A') {
              window.open(encodeURI(e.target.parentNode.href), '_system', "presentationstyle=fullscreen,closebuttoncaption=close,location=no,transitionstyle=fliphorizontal");
              return false;
            }
          });
        });
      }
    };
  }])
  .directive('setHeight', function($window) {
    return {
      link: function(scope, element, attrs) {
        element.css('height', $window.innerHeight + 30);
      }
    }
  })
  .controller("MenuCtrl", ["$scope", "MenuService", "$stateParams", "$state", "ConfigUrls", function($scope, MenuService, $stateParams, $state, ConfigUrls) {
    //  debugger;
    console.log("MenuCtrl");

    $scope.menuData = [];
    $scope.noMenuDataMsg = "Loading....";
    $scope.LoadMenu = function(forceLoad) {
      console.log("MenuCtrl - LoadMenu");

      //  console.log(MenuService.getClinicalAreas(forceLoad));
      MenuService.getClinicalAreas(forceLoad).then(function(data) {
        $scope.menuData = data;
      }, function(err) {
        console.log(err);
        if (err.error === "timeout") {
          $scope.noMenuDataMsg = "Error: Unable to retrieve data due to network error! Please try again when you are in network."
        } else {
          $scope.noMenuDataMsg = "Error retrieving data! Please contact system administrator."
        }
        $scope.menuData = [];
      }).finally(function() {
        $scope.$broadcast('scroll.refreshComplete');
      });
    }
    $scope.deviceModel = window.localStorage.getItem("deviceModel");
    // console.log(MenuService);
    // console.log($scope.menuData);
    $scope.title = $stateParams.topTitle;
    var metaTag = $stateParams.metaTag;
    //console.log(ConfigUrls[metaTag+"Published"]);
    if (metaTag !== "") {
      window.localStorage.setItem('publishedUrl', ConfigUrls[metaTag + "Published"]);
      window.localStorage.setItem('docUrl', ConfigUrls[metaTag + "DocUrl"]);
      window.localStorage.setItem('cacheKeyPrefix', metaTag);

      $scope.LoadMenu(false);
    } else {
      $scope.noMenuDataMsg = "Under Construction!";
    }

    //console.log("metaTag",metaTag);
    //if ($stateParams.topTitle === "Transplant") {
    //    $scope.LoadMenu(false);
    //}
    //else {
    //    $scope.noMenuDataMsg = "Under Construction!";
    //}
    $scope.showHomeItem = function(clinicalArea) {
      console.log("MenuCtrl - showHomeItem");

      $state.go('contr.home', {
        cA: clinicalArea
      });
    }
    $scope.goHome = function() {
      console.log("MenuCtrl - goHome");

      $state.go('contr.topmenu');
    }
  }])
  .controller("HomeCtrl", ["$scope", "HomeService", "$stateParams", "$state", function($scope, HomeService, $stateParams, $state) {


    console.log("HomeCtrl");

    $scope.organs = [];
    $scope.title = $stateParams.cA;
    $scope.LoadHome = function(forceLoad) {
      console.log("HomeCtrl - LoadHome");

      HomeService.getOrgans($stateParams.cA, forceLoad).then(function(data) {
        $scope.organs = data;
      }, function(err) {
        $scope.organs = [];
      }).finally(function() {
        $scope.$broadcast('scroll.refreshComplete');
      });
    }
    $scope.showLevel2Item = function(title, clinicalArea) {
      console.log("HomeCtrl - showLevel2Item");

      $state.go('contr.level2', {
        title: title,
        cA: clinicalArea
      });
      //:title/:cA
    }

    $scope.goHome = function() {
      console.log("HomeCtrl - goHome");

      $state.go('contr.topmenu');
    }

    $scope.LoadHome(false);

  }])
  .controller('Level2Ctrl', ["$scope", "OrganService", "$stateParams", "$state", function($scope, OrganService, $stateParams, $state) {
    $scope.title = "Level2 ";

    console.log("Level2Ctrl");

    $scope.parentOrgan = {};
    $scope.viewTitle = $stateParams.title;

    OrganService.getSingleOrganDetail($stateParams.cA, $stateParams.title).then(function(data) {
      $scope.parentOrgan = data[0];
      $scope.parentOrgan.clinicalAreaDisp = "Transplant";
    }, function(err) {
      $scope.parentOrgan = {};
    });

    console.log($scope.parentOrgan);

    $scope.subGroup = [];

    $scope.LoadSubGroups = function(forceLoad) {
      console.log("Level2Ctrl - LoadSubGroups");
      OrganService.getSubGroups($stateParams.title, $stateParams.cA, forceLoad).then(function(data) {
        $scope.subGroup = data;
        console.log("$scope.subGroup", $scope.subGroup);
      }, function(err) {
        $scope.subGroup = [];
      }).finally(function() {
        $scope.$broadcast('scroll.refreshComplete');
      });
    }


    //$scope.deviceModel = window.localStorage.getItem("deviceModel");
    //$scope.devicePlatform = window.localStorage.getItem("devicePlatform");

    $scope.toggleGroup = function(group) {
      group.show = !group.show;
    };
    $scope.isGroupShown = function(group) {
      return group.show;
    };
    $scope.showDocumentDtl = function(id, docTitle, sgName, mnGroup, area) {
      console.log("Level2Ctrl - showDocumentDtl");

      $state.go('contr.doc-dtl', {
        id: id,
        docTitle: docTitle,
        sgName: sgName,
        mnGroup: mnGroup,
        area: area
      });
      //:title/:cA
    }
    $scope.goHome = function() {
      console.log("Level2Ctrl - goHome");
      $state.go('contr.topmenu');
    }
    $scope.LoadSubGroups();
  }])
  .controller('DocumentCtrl', ["$scope", "DocmentService", "zoomPerOrientation", "$stateParams", "$ionicScrollDelegate", "$state", function($scope, DocmentService, zoomPerOrientation, $stateParams, $ionicScrollDelegate, $state) {
    $scope.viewData = {};
    $scope.snippet = "<p style='margin-top:40%;margin-left:40%;font-weight:bold;font-size:1.6em;' class='item item-stable'>Loading...</p>";
    $scope.statusMessage = "";
    $scope.title = $stateParams.mnGroup;

    console.log("DocumentCtrl");

    console.log("$stateParams", $stateParams);
    //, $stateParams.docTitle, $stateParams.sgName, $stateParams.mnGroup, $stateParams.area
    // console.log("Inside docuemtn controller");
    $scope.LoadDocument = function(forceLoad) {
      console.log("DocumentCtrl - LoadDocument");
      DocmentService.getRowDocument($stateParams.id, $stateParams.docTitle, $stateParams.sgName, $stateParams.mnGroup, $stateParams.area, forceLoad).then(
        function(data) {
          // console.log("successfull", data);
          $scope.viewData = data;
          $scope.snippet = $scope.viewData.document;
        },
        function(reason) {
          //  console.log("Error Occured", reason);
          $scope.viewData = {
            "docTitle": "Error Occured!"
          };
          if (reason.error === "timeout") {
            $scope.snippet = "<div style='margin-top:40%;margin-left:15%;font-weight:bold;font-size:1.6em;width:600px !important;padding:16px !important;line-height:120%;' class='item item-stable item-text-wrap item-complex'>Error: Unable to the load the document at this time. Please make sure you are in the network or you have already fetched the document while you were in the network!</div>";
          }
          //  $scope.statusMessage = err;
        }).finally(function() {
        console.log("finally", data);
        $scope.$broadcast('scroll.refreshComplete');
      });
    }

    //below code would be refactored in near future.
    //It is not a good practice adding window event listener in the controller
    window.addEventListener('orientationchange', function() {
      try {
        if ($ionicScrollDelegate.$getByHandle('docScroll')._instances.length > 2) {
          zoomPerOrientation.zoomTo('docScroll');
        }
      } catch (exception) {
        console.log(exception);
      }

    });
    $scope.goHome = function() {
      console.log("DocumentCtrl - goHome");
      $state.go('contr.topmenu');
    }

    $scope.LoadDocument(true);
  }])
  .controller('TopMenuCtrl', ["$scope", "TopMenuService", "$state", "$ionicHistory",
    function($scope, TopMenuService, $state, $ionicHistory) {
      $ionicHistory.clearHistory();
      $scope.title = "Rules";
      $scope.menuItems = [];
      $scope.menuItemsLandscape = [];
      $scope.flatMenuItems = [];
      $scope.tileView = true;
      $scope.listView = false;
      $scope.portraitMode = true;

      console.log("TopMenuCtrl");

      TopMenuService.getMenuItems().then(function(data) {
          $scope.menuItems = data.colData;
          $scope.flatMenuItems = data.flatData;
          $scope.menuItemsLandscape = data.threeColData;
          console.log($scope.menuItems);
        },
        function() {
          $scope.menuItems = [];
        });

      $scope.showMenuItem = function(title, metaTag) {
        console.log("TopMenuCtrl - showMenuItem");

        //$state.go('tab.menu', { topTitle: title });
        $state.go('contr.menu', {
          topTitle: title,
          metaTag: metaTag
        });
      }

      $scope.itemChanged = function() {
        console.log("TopMenuCtrl - itemChanged");

        console.log($scope.tileView);
        if ($scope.tileView) {
          $scope.listView = true;
          $scope.tileView = false;

        } else {
          $scope.listView = false;
          $scope.tileView = true;
        }
      }
      //  console.log(window.orientation);
      function onChangeOrientation() {
        console.log("TopMenuCtrl - onChangeOrientation");

        try {
          //landscape mode
          // console.log("Orientation Changed");

          if (window.orientation === 90 || window.orientation == -90) {
            $scope.portraitMode = false;
          }
          //portrait
          else {
            $scope.portraitMode = true;
          }
        } catch (exception) {
          console.log(exception);
        }
      }

      onChangeOrientation();
      window.addEventListener('orientationchange', function() {
        try {
          //landscape mode
          // console.log("Orientation Changed");

          if (window.orientation === 90 || window.orientation == -90) {
            $scope.$apply(function() {
              $scope.portraitMode = false;
            });
          }
          //portrait
          else {
            $scope.$apply(function() {
              $scope.portraitMode = true;
            });
          }
        } catch (exception) {
          console.log(exception);
        }

      });

    }
  ])
  .controller('LoginController', ["$scope", "$location", "$ionicHistory", '$timeout', '$ionicLoading', '$state',
    function($scope, $location, $ionicHistory, $timeout, $ionicLoading, $state) {

      $scope.username = "Guest";
      $scope.password = "Abcd123";
      // $ionicNavBarDelegate.showBar(false);
      $scope.login = function(password) {
        console.log("LoginController - login");

        if (password) {
          $ionicLoading.show({
            content: 'Loading',
            animation: 'fade-in',
            showBackdrop: true,
            template: '<p class="item-icon-left bar-header"><ion-spinner icon="lines"/></p>',
            maxWidth: 200,
            showDelay: 0
          });
          window.localStorage.setItem("Pswd", password);
          $ionicHistory.nextViewOptions({
            disableAnimate: true,
            disableBack: true
          });

          $timeout(function() {
            $ionicLoading.hide();
            //$location.path("/tab/topmenu");
            $state.go('contr.topmenu');
          }, 1000);
        }
      }
    }
  ])
  .controller('AccountCtrl', function($scope) {
    $scope.settings = {
      enableFriends: true
    };
  });

Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация. Кроме того, в настоящее время я поддерживаю локальный кэш для локального кэширования категорий, но не предварительно кэшированного. Есть ли способ получить эти документы заранее? Пожалуйста, проверьте мой раздел loaddocuments, который касается загрузки URL-адреса документа после того, как вы нажмете на определенный элемент.


person Community    schedule 19.06.2017    source источник
comment
пожалуйста, не используйте тег angular в вопросах, связанных с angularjs   -  person Jota.Toledo    schedule 19.06.2017
comment
Вы пытались использовать локальное хранилище или локальную БД?   -  person Sangwin Gawande    schedule 23.06.2017
comment
У меня есть, и это работает для отдельных элементов в категориях. Я ищу предварительную выборку URL-адресов и кэширование содержимого прямо при запуске приложения, чтобы пользователи могли просматривать данные даже в автономном режиме. Есть ли способ сделать это?   -  person    schedule 26.06.2017


Ответы (1)


Пожалуйста, обратитесь к этому, я уже объяснил все с подходом к программированию.

Ссылка на решение StackOverflow

Вы можете использовать этот объясненный подход и добавить для тех, кто ищет ответ на этот вопрос.

person MobileEvangelist    schedule 03.07.2017