- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想创建一个包含 6 个页面的 Ionic 2 应用程序,我不确定是对各个类别页面使用 Pipe 还是 Filter 以及我需要这样做的代码。
每个类别页面可以加载“applecat”类别定义的相关产品。下面是 API,通过 Google 表格以电子表格格式显示产品,以及一个非常快速的主页模型创意:
https://sheetsu.com/apis/v1.0/04c2d2906a10 https://docs.google.com/spreadsheets/d/1RNLXsxTFymqRwq_S538qX1p1PAEDIEA6s5sV8etkfLU/edit?usp=sharing
概述
6 页
场景(潜在用户流)
用户打开应用程序,点击主页,然后点击 Ipad 类别链接(加载所有 Ipad 产品)然后回到首页决定点击All(Loads ALL products),返回并点击另一个页面....
问题
它会加载 2 个数组到内存/控制台吗?类别页面应该使用过滤器还是管道?代码应如何查找与我现有的 API 调用和产品列表数组相关的管道/过滤器?
vendor
getRemoteData(): any{
return this.http.get('https://sheetsu.com/apis/v1.0/04c2d2906a10')
.map(res => res.json());
}
列表页
@Component({
selector: 'page-master',
templateUrl: 'master.html',
providers: [Sheetsu]
})
export class MasterPage {
// declare publicly accessible variable
public sheetsuData: any;
constructor(public navCtrl: NavController, public navParams: NavParams, public sheetsuService: Sheetsu) {}
ionViewDidLoad() {
this.sheetsuService.getRemoteData()
.subscribe(response => {
// assign variable (async)
this.sheetsuData = response;
});
}
我看到了一个带有重置的过滤器示例,但不确定它是否适用于这种情况?
resetData(){
this.modifiedData = JSON.parse(JSON.stringify(this.originalData));
}
filterData(){
this.modifiedData = this.modifiedData.filter((youtuber) => {
return youtuber.subscribers > 1000000;
}
}
对于如此少的类别页面,也许 Pipe 是每个页面的最佳选择?如果用户浏览所有 6 个页面,则只是多个 API 调用的潜在问题。
首选赏金答案:管道/过滤器/服务的代码,关于最佳解决方案的建议及其原因,甚至更好的是 Github 中的基本工作示例(上面提供了对提供程序和列表 ts 代码的 API 调用)。
可以从 https://github.com/jones98/4cat 查看和 fork 此内容的 Github 存储库
可以在 https://drive.google.com/file/d/0B0QBawqyq1vPZ0o4WEpaa0o0azQ/view 查看当前状态下应用程序的视频(预分类页面工作)
最佳答案
您可以创建一个缓存数据的服务(可能是 5 分钟、30 分钟、1 小时,或任何在您的应用程序上下文中有意义的时间间隔)以避免发出如此多的 http 请求,并且将也只返回你需要的东西,这样你就可以直接在组件/ View 中使用它,而不需要过滤任何东西。
这不仅会减少对服务器发出的大量无用的 http 请求,而且还会使应用速度更快,因为用户打开产品页面的大部分时间都将使用本地数据。
假设您已经有一个产品类:
export class ProductModel {
public aw_deep_link: string;
public product_name: string;
public apple_cat: string;
//...
}
然后我们可以像这样创建我们的缓存模型:
class ProductCache {
public products: Array<ProductModel>;
public timestamp: number;
public isValid(): boolean {
if(!this.products) {
return false;
}
let isExpired = Date.now() - this.timestamp > 1800000; // 30 min
return !isExpired;
}
}
然后我们可以在我们的 ProductCategoryService 中使用它
// Angular imports
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
// Rxjs imports
import { Observable } from 'rxjs';
import 'rxjs/add/operator/map';
@Injectable()
export class ProductCategoryService {
private cache: ProductCache;
private apiUrl: string = 'https://sheetsu.com/apis/v1.0/04c2d2906a10';
constructor(private http: Http) {
this.cache = new ProductCache();
}
public getAll(): Observable<Array<ProductModel>> {
if(this.cache.isValid()) {
// Return the products from the cache
return Observable.of(this.cache.products);
}
// Cache is empty/expired, so we need to make the http request
return this.http.get(this.apiUrl).map(res => res.json()).map(data => {
// Save the data in the cache for the next time
this.cache.products = data;
this.cache.timestamp = Date.now();
// Return the list of (all) products
return this.cache.products;
});
}
public getIpadProducts(): Observable<Array<ProductModel>> {
return this.getAll().filter((product: ProductModel) => {
return product.apple_cat.toLowerCase() === 'ipad';
});
}
public getIphoneProducts(): Observable<Array<ProductModel>> {
return this.getAll().filter((product: ProductModel) => {
return product.apple_cat.toLowerCase() === 'iphone';
});
}
// ...
}
然后只需在每个页面中调用正确的方法,由于产品的缓存,http 请求只会发出一次(或在本例中为每 30 分钟一次)。
可能存在语法错误或拼写错误(我直接在 SO 答案中编码),但这应该让您了解如何处理给定的场景。如果有什么地方不能正常工作,请告诉我,以便我可以帮助您解决问题...
更新:Here您可以找到一些信息(来自 Angular 2 Docs),说明为什么使用管道过滤数据不是一个很好的方法,这就是为什么我建议在服务中这样做,对其他人保持隐藏应用程序的(毕竟,每个类别页面只是想获得它需要显示的数据,它不应该处理所有产品然后只找到它需要在 View 中显示的产品)。
关于javascript - 使用过滤器或管道将产品类别加载到 Ionic 2 的页面中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42139522/
我想要显示正在加载的 .gif,直到所有内容都已加载,包括嵌入的 iframe。但是,目前加载 gif 会在除 iframe 之外的所有内容都已加载后消失。我怎样才能让它等到 iframe 也加载完毕
首先,这是我第一次接触 Angular。 我想要实现的是,我有一个通知列表,我必须以某种方式限制 limitTo,因此元素被限制为三个,在我单击按钮后,其余的应该加载。 我不明白该怎么做: 设置“ V
我正在尝试在我的设备上运行这个非常简单的应用程序(使用 map API V2),并且出于某种原因尝试使用 MapView 时: 使用 java 文件: public class MainMap e
我正在使用 Python 2.6、Excel 2007 Professional 和最新版本的 PyXLL。在 PyXLL 中加载具有 import scipy 抛出异常,模块未加载。有没有人能够在
我想做这个: 创建并打包原始游戏。然后我想根据原始游戏中的蓝图创建具有新网格/声音/动画和蓝图的其他 PAK 文件。原始游戏不应该知道有关其他网格/动画/等的任何信息。因此,我需要在原始游戏中使用 A
**摘要:**在java项目中经常会使用到配置文件,这里就介绍几种加载配置文件的方法。 本文分享自华为云社区《【Java】读取/加载 properties配置文件的几种方法》,作者:Copy工程师。
在 Groovy 脚本中是否可以执行条件导入语句? if (test){ import this.package.class } else { import that.package.
我正在使用 NVidia 视觉分析器(来自 CUDA 5.0 beta 版本的基于 eclipse 的版本)和 Fermi 板,我不了解其中两个性能指标: 全局加载/存储效率表示实际内存事务数与请求事
有没有办法在通过 routeProvider 加载特定 View 时清除 Angular JS 存储的历史记录? ? 我正在使用 Angular 创建一个公共(public)安装,并且历史会积累很多,
使用 Xcode 4.2,在我的应用程序中, View 加载由 segue 事件触发。 在 View Controller 中首先调用什么方法? -(void) viewWillAppear:(BOO
我在某些Django模型中使用JSONField,并希望将此数据从Oracle迁移到Postgres。 到目前为止,当使用Django的dumpdata和loaddata命令时,我仍然没有运气来保持J
创建 Nib 时,我需要创建两种类型:WindowNib 或 ViewNib。我看到的区别是,窗口 Nib 有一个窗口和一个 View 。 如何将 View Nib 加载到另一个窗口中?我是否必须创建
我想将多个env.variables转换为静态结构。 我可以手动进行: Env { is_development: env::var("IS_DEVELOPMENT")
正如我从一个测试用例中看到的:https://godbolt.org/z/K477q1 生成的程序集加载/存储原子松弛与普通变量相同:ldr 和 str 那么,宽松的原子变量和普通变量之间有什么区别吗
我有一个重定向到外部网站的按钮/链接,但是外部网站需要一些时间来加载。所以我想添加一个加载屏幕,以便外部页面在显示之前完全加载。我无法控制外部网站,并且外部网站具有同源策略,因此我无法在 iFrame
我正在尝试为我的应用程序开发一个Dockerfile,该文件在初始化后加载大量环境变量。不知何故,当我稍后执行以下命令时,这些变量是不可用的: docker exec -it container_na
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我刚刚遇到一个问题,我有一个带有一些不同选项的选择标签。 现在我想检查用户选择了哪些选项。 然后我想将一个新的 html 文件加载到该网站(取决于用户选中的选项)宽度 javascript,我该怎么做
我知道两种保存/加载应用程序设置的方法: 使用PersistentStore 使用文件系统(存储,因为 SDCard 是可选的) 我想知道您使用应用程序设置的做法是什么? 使用 PersistentS
我开始使用 Vulkan 时偶然发现了我的第一个问题。尝试创建调试报告回调时(验证层和调试扩展在我的英特尔 hd vulkan 驱动程序上可用,至少它是这么说的),它没有告诉我 vkCreateDeb
我是一名优秀的程序员,十分优秀!