如何在ionic/angularjs中预取url?

13 javascript performance angularjs ionic-framework

我对离子1很新,我正在开发一个带有多个URL的应用程序(带有Ionic 1和angular js),每个URL都会显​​示一个类别列表,然后是每个类别的项目列表,每个项目都有一个文档URL.如何在后台启动时预加载所有这些URL但不显示它们?有什么办法可以实现吗?一个好的代码示例或教程将有很大帮助.另外,请告诉我这是否是最好的方法,如在启动时预加载和预缓存所有内容,或者应该按类别或其他方式完成.

提前致谢!

Mob*_*ist 0

我假设您不想在下一个屏幕中加载数据,为用户提供完美的体验。

是的,您可以开始在第一页上加载 URL,因为您希望它们获取您想要在以后的屏幕中使用的数据。

在存储方面

  1. 在 AngularJs 中,如果你希望某些东西在整个应用程序范围内持久存在,你应该使用 $rootscope[注意保留大量数据可能会导致内存问题,你需要定期清除它]。
  2. 或者另一种选择是将其存储在本地存储中。并根据您的需要获取。
  3. 如果您愿意,您可以在不同的屏幕控制器之间共享这些数组。

加载[从服务器获取响应]时,你可以做两件事 1. get single JSON response having all the data 2.have multiple urls, and load them serially.

根据您提前加载第五(页)屏幕数据的要求,这不是一个好的做法,甚至会阻止用户看到更新,但因为这是您的要求。我们有几种方法:

  1. 根据您的pastebin添加所有类别及其各自的详细信息,例如心脏,然后是详细信息..肾脏,然后是详细信息..您可以通过管理层次结构[类别](例如JSONArray中的父主组及其子子组和JSONObject中的详细信息)来执行此操作。(此更改将在发送方 - 服务器上进行)

您只需加载一个 url 即可获取所有数据。因此,您不需要像现在一样加载不同的网址。但要注意,这将是一个很大的 Json。因此,当您存储它时,将类别和所需数据[屏幕方面的要求]分开,并存储在本地存储中,以便于访问。

  1. 另一种方法是您必须提供要加载的 [category] ​​子组名称,因此加载就像使用不同类别名称触发相同的 URL 来获取数据并将其存储在本地存储中一样。

这可能会导致火灾大约 10-15[取决于您的类别] url 可能会影响 UI 线程响应。这不需要对服务器端响应进行任何更改。

**

以编程方式顺序加载 url:

**

URL 加载:此方法将获取特定类别的详细信息 [id 或任何适合您的内容]。这将触发 http 请求并返回结果。

getCategoryDetails(category){
url = url+category;
return $http({ 
        method: 'GET', 
        url: url, 
        headers: --
    }).then(function onSuccess(response) {  //<--- `.then` transforms the promise here
Run Code Online (Sandbox Code Playgroud)

//您可以将响应存储在本地存储中 return response }, function onError(response) { throw customExceptionHadnler.getErrorMsg(response.status, response.data); }); }

并行:此方法将并行执行,我们只需加载所有类别[ids],然后使用 $q.all 等待所有网址加载完成。

 function loadUrlsParallel(urls) {
     var loadUrls = []
     for(var i = 0; i < urls.length; i++) {
         loadUrls.push(getCategoryDetails(urls[i]))
     }
     return $q.all(loadUrls) 
}
Run Code Online (Sandbox Code Playgroud)

第一个 API:此方法加载第一个 url,然后并行调用上面的方法加载 url

getListOfCategories(){
url = url;
return $http({ 
        method: 'GET', 
        url: url, 
        headers: --
    }).then(function onSuccess(response) {  //<--- `.then` transforms the promise here
Run Code Online (Sandbox Code Playgroud)

//您可以将响应存储在本地存储中或直接发送响应 return response }, function onError(response) { throw customExceptionHadnler.getErrorMsg(response.status, response.data); }); }

urls :您必须准备 url 列表,并在加载第一个 url 后附加要加载的类别[预计这会预先返回您应用程序中需要的所有类别]并传递给 loadUrlsParallel 方法。

您可以根据自己的方便编写 loadUrl 方法,这里给出的任何内容都是示例目的,因此可能不会按原样运行。

您可以从 API 调用后存储的本地存储中的任何地方加载 API 响应,因此这不会要求您在每次加载页面时执行 API 调用[屏幕]

希望这对您有帮助并解决您的问题。