我有一些以下的应用程序状态树:
AppState
{
MyPage1 - MyList - MyItem[]
MyPage2 - MySubPage - MyList - MyItem[]
MyPage3 - MyItem //can be stand-alone as well
}
Run Code Online (Sandbox Code Playgroud)
所以,我有一个页面上的项目列表.我通过将操作分派给MyList reducer来加载此列表.加载项后,它们将作为输入传递给MyListComponent,从而使用相应的输入创建MyItemComponents.MyItemComponent也可以是独立的.因此,它并不总是依赖于MyList.
问题在于每个MyItems都有自己的动作(例如可以被喜欢或编辑).而且我现在卡在哪里,在那种情况下我应该采取什么行动.如何识别哪个项目已更新以及应更新哪个列表.
当用户更新列表中的某个项目时,操作流程是什么?
而且 - 如果我直接更改其中一个MyItem,是否会检测到MyList的状态更改?
我可能会想到的场景是(在MyItem本身上有所有适当的操作)向MyList添加额外的动作 - 例如:
updateItem(payload:
{
updateType, //e.g. like, edit, delete
data, //data needed to make an update
itemId //index in the MyItem array
})
Run Code Online (Sandbox Code Playgroud)
然后,我以某种方式从MyList向数组中的指定MyItem触发另一个动作,item触发相应的动作以更新其自己的状态(通过@Effect更新)如果更新成功,则触发新动作以更新列表.
说实话,这一切看起来都非常冗长和含糊.甚至不确定如何在实践中实施.真的需要有经验的人的建议.
ps我应该提到所有数据都是从REST api获取并发回的.
编辑:如果遵循@ngrx/store综合介绍的方法,应用程序会有重复操作的音调(每个容器 - MyList - 将重复MyItem的所有操作).我的案子会有更合适的方法吗?
在我们的 Angular 6 应用程序中,我们使用预构建的 React 应用程序来渲染一些内部组件。React 应用程序的编译版本作为节点模块安装。
当我在开发模式下运行代码时ng serve,一切都按预期完美运行。
但是,当我在 中构建应用程序时--prod,React 组件的行为开始有所不同。出现一些奇怪的渲染问题。
我正在试验 angular-cli 设置,并意识到如果我禁用optimization("optimization": false),问题就消失了。但是包的大小变大了 2 倍。
这些是我尝试过的设置。以及相应的结果:
optimization: false, buildOptimizer: true, vendorChunk: false - 33.3mb (works good)
optimization: true, buildOptimizer: false, vendorChunk: false - 17mb (not working)
optimization: true, buildOptimizer: false, vendorChunk: true - 17mb (not working)
Run Code Online (Sandbox Code Playgroud)
当 Angular 尝试优化 React 模块时,似乎出现了问题。
我认为最好为除 React 应用程序模块之外的所有项目启用优化。以某种方式从优化管道中排除 React 应用程序模块,如果有意义的话,可能会将其捆绑在一个单独的块中。
有人可以提出解决方案吗?或者任何猜测为什么会发生这种情况?
我想知道是否可以在查询列表中使用"child_added"事件.像这样:
this.curUserPosts = this.af.database.list('/posts', {
query: {
orderByChild: 'user/id',
equalTo: id
}
}).$ref.on("child_added", (child) => {
console.log(child);
});
Run Code Online (Sandbox Code Playgroud)
我对以下内容感兴趣:它会起作用吗?仅当添加的子对应于查询时才会正常触发.性能如何.
而且,在firebase中处理这些查询列表的首选方法是什么?
rxjs firebase firebase-realtime-database angularfire2 angular
我遇到了一个奇怪的问题.我正在尝试使用mongodb spark连接器将Spark本地连接到MongoDB.
除了设置火花我还使用以下代码:
val readConfig = ReadConfig(Map("uri" -> "mongodb://localhost:27017/movie_db.movie_ratings", "readPreference.name" -> "secondaryPreferred"), Some(ReadConfig(sc)))
val writeConfig = WriteConfig(Map("uri" -> "mongodb://127.0.0.1/movie_db.movie_ratings"))
// Load the movie rating data from Mongo DB
val movieRatings = MongoSpark.load(sc, readConfig).toDF()
movieRatings.show(100)
Run Code Online (Sandbox Code Playgroud)
但是,我收到编译错误:
java.lang.IllegalArgumentException: Missing database name. Set via the 'spark.mongodb.input.uri' or 'spark.mongodb.input.database' property.
Run Code Online (Sandbox Code Playgroud)
在线我在哪里设置readConfig.我不明白为什么当我在地图上清楚地拥有uri属性时,它抱怨没有设置uri.我可能会遗漏一些东西.
我有一个需要计算基于电影内容的相似性的Spark工作.有46k电影.每部电影由一组SparseVectors表示(每个矢量是电影场之一的特征向量,例如Title,Plot,Genres,Actors等).例如,对于Actors和Genres,向量显示给定的actor是否在电影中存在(1)或不存在(0).
任务是为每部电影找到前10个类似的电影.我设法在Scala中编写一个脚本来执行所有这些计算并完成工作.它适用于较小的电影集,如1000部电影,但不适用于整个数据集(内存不足等).
我进行此计算的方法是在电影数据集上使用交叉连接.然后通过仅获取movie1_id <movie2_id的行来减少问题.此时数据集仍然包含46000 ^ 2/2行,即1058000000.每行都有大量数据.
然后我计算每一行的相似度得分.在计算相似度之后,我将movie1_id相同的结果分组,并按照相似性得分的降序对它们进行排序,使用前N个项目的Window函数(类似于此处描述的方式:Spark获得每个项目的前N个最高得分结果(item1,item2) ,得分)).
问题是 - 它可以在Spark中更有效地完成吗?例如,无需执行crossJoin?
还有一个问题--Spark如何处理如此庞大的数据帧(1058000000行由多个SparseVectors组成)?是否必须一次将所有这些保留在内存中?或者它是否以某种方式逐个处理这样的数据帧?
我正在使用以下函数来计算电影矢量之间的相似性:
def intersectionCosine(movie1Vec: SparseVector, movie2Vec: SparseVector): Double = {
val a: BSV[Double] = toBreeze(movie1Vec)
val b: BSV[Double] = toBreeze(movie2Vec)
var dot: Double = 0
var offset: Int = 0
while( offset < a.activeSize) {
val index: Int = a.indexAt(offset)
val value: Double = a.valueAt(offset)
dot += value * b(index)
offset += 1
}
val bReduced: BSV[Double] = new BSV(a.index, a.index.map(i => b(i)), a.index.length)
val maga: Double …Run Code Online (Sandbox Code Playgroud) 我有一个设置,我可以在 firebase 中查询用户最喜欢的帖子列表。
基本上,首先我查询用户喜欢,然后为每个喜欢获取相应的帖子 - 所有这些都在一个可观察的序列中。
当用户不喜欢唯一留下的帖子时,就会出现问题。在这种情况下(当 likes 数组变空时)不会从 observable 中触发任何内容并且视图不会更新(总是至少有一个帖子存在)。
一方面,这种行为似乎合乎逻辑且可以理解,但另一方面,即使 switchMap 的输入为空,我也不知道如何使最终的 Observable 发出。也许应该改变运营商。
getUserFavourites(userId = ""):Observable<Post[]>
{
if (!this.userFavourites$) {
this.userFavourites$ = this.af.database.list('/ranks_by_user/' + userId, {
query: {
limitToFirst: 50
}
}) //Emits value here (even empty array)
.switchMap((likes: any[]) => Observable.combineLatest(
likes.map(like => this.af.database.object("/posts/" + like.$key).first())
)) //Does not emit new value here if likes array was empty
.map(p => {
return p.map(cit => Post.unpack(p));
}).publishReplay(1).refCount()
}
return this.userFavourites$;
}
Run Code Online (Sandbox Code Playgroud) 我正在构建一个应用程序,其中包含带有电影列表的不同页面。例如搜索页面(按搜索的电影)、演员的页面(按演员的电影)、类型的页面(按类型的电影)。问题是它们都共享相同的基本功能 - 根据某些标准加载电影列表。我有一个减速器,用于在加载某些内容后存储电影实体。但问题是我必须为每个页面类型创建一个单独的减速器来保存相关的电影 ID 以显示。
最初,我只是从头开始实现所有这些页面,同时复制大量代码 - 每个页面的单独操作、效果、reducers。现在我觉得它很丑陋,可以以更简洁的方式完成。
我的服务中已经有一个通用的queryMovies函数,它通过 options 参数查询电影。
你能提出任何组织这些代码的好方法吗?
编辑:
由于此帖已被删除,我无法发表评论或回复(只能编辑)。所以我添加这个链接作为编辑的一部分:https : //github.com/johnpapa/angular-ngrx-data
我认为这是一个很好的问题,并希望看到更多关于 ngRx 的适当架构/模式的讨论。
我们在我们的应用程序中使用Angular 6.我们最近开始准备我们的应用程序来进行延迟加载.应用程序有多个延迟加载的路由.我们希望为所有路由使用单个语言文件(不需要将其分成块.但是在bootstrap上加载所有翻译).
我尝试的第一件事就是在AppModule(forRoot)中导入和配置ngx-translate而不是其他地方.为此,我使用以下代码为TranslateModule创建了一个配置文件:
import {
MissingTranslationHandler, MissingTranslationHandlerParams, TranslateLoader,
TranslateModuleConfig
} from '@ngx-translate/core';
import {HttpClient} from '@angular/common/http';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
export class MyMissingTranslationHandler implements MissingTranslationHandler {
handle(params: MissingTranslationHandlerParams): string {
return '';
}
}
export function createTranslateLoader(http: HttpClient): TranslateHttpLoader {
return new TranslateHttpLoader(http, '/l10n/', '.json');
}
export const TRANSLATE_MODULE_CONFIG: TranslateModuleConfig = {
loader: {
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [HttpClient]
},
missingTranslationHandler: {provide: MissingTranslationHandler, useClass: MyMissingTranslationHandler},
};
Run Code Online (Sandbox Code Playgroud)
这仅适用于急切加载的路线.对于延迟加载的所有文本都是空的.
然后我尝试forChild()在延迟加载的模块中使用与TranslateModule相同配置的方法(因为它在这里写 - ngx-translate).结果相同.我还尝试简单地将TranslateModule导入到延迟加载的模块中,而不提供任何配置.
这两种方式都不奏效.延迟加载的路由中的所有文本字段都是空的.
有没有人有类似的问题?我在网上搜索但找不到任何具体的解决方案.如何将来自同一文件的翻译正确应用于延迟加载的模块?
在我的应用程序中,我有以下firebase帖子结构:
posts: {
text: ".."
meta: {..}
user: {
id: "user1",
username: ".."
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用angularfire2.因此,要获取特定用户发布的所有帖子,我运行以下查询:
this.userPosts$ = this.af.database.list('/posts', {
query: {
orderByChild: 'user/id',
equalTo: userId
}
}).map( (posts) => {
return posts.map(post => Post.unpack(post));
}).publishReplay(1).refCount();
Run Code Online (Sandbox Code Playgroud)
我听说它效率不高,因为每次有变化(即使在一个帖子中),整个列表都会被重新加载,从而重新渲染.由于我在我的应用程序中有喜欢和不喜欢,这将经常发生.基本上每当有人喜欢帖子时,如果我没有弄错的话,每个用户都会重新加载整个列表.
我知道有一种方法可以在监听firebase事件时维护列表的本地副本:"child_added","child_removed"和"child_changed".但是,如果我将这些事件附加到查询列表中,则每次原始帖子列表中的某些内容发生更改时,它们都会触发.
所以,我在想这里采取什么方法.我可能会将帖子数据复制到firebase中的"user_posts"列表中,如果它是唯一的好选择.然而,通过这种方法,我觉得查询变得几乎无用,我失去了灵活性.大约一个星期前我开始使用firebase,所以我可能仍会有一些误解.
database firebase firebase-realtime-database angularfire2 angular
我正在尝试使用Ionic2和Firebase实现无限滚动.
我使用AngularFire2.我想要做的是将新项添加到提取的列表,而不是重新加载整个列表.
let query$:Observable<any> = this.af.database.list(`quests/`, {
query: {
orderByChild: 'date_published',
limitToFirst: this.recentChunkLimit$ //Subject where I push new limit length
}
}).publishReplay(1).refCount();
Run Code Online (Sandbox Code Playgroud)
但是,当我查询这样的列表时,每次通过websockets重新加载整个列表,使每次下一次更新变得越来越慢.以下是网络websockets选项卡的屏幕截图:
而且我注意到每个下一个块的请求都是2次(尽管我放了publishReplay).它发生在我使用AngularFire2的所有应用程序中.我可能会误解一些事情.我当然需要一些澄清.
// ==========编辑============
现在,我以某种方式设法实现我想要的,而不是每次都重新加载整个列表.不是最好的实现,但它的工作原理.基本上,我创建了一个可观察的数组,并通过订阅下一个chunk observable(其中我也得到了最后一个元素)来加载新的值.然而,后来的问题仍然存在 - 在套接字显示中,我获得了2次请求数据.
在我的应用程序中,我需要从Map创建一个单行DataFrame。
这样的地图就像
("col1" -> 5, "col2" -> 10, "col3" -> 6)
Run Code Online (Sandbox Code Playgroud)
将被转换为具有单行的DataFrame,并且映射键将成为列的名称。
col1 | col2 | col3
5 | 10 | 6
Run Code Online (Sandbox Code Playgroud)
如果您想知道为什么要这样做-我只需要使用MongoSpark连接器将包含一些统计信息的单个文档保存到MongoDB中,该连接器就可以保存DF和RDD。
我很难理解如何允许用户在列表中创建新记录,但只允许创建者更新自己的帖子.
例如以下结构:
post {
post1: {
author: "user1"
text: "Some text"
}
post2: {
author: "user2"
text: "Some text 2"
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我希望两个用户都能够创建新帖子.但也可以保护post2不被user1编辑.因此,只有user1可以编辑post1,只有user2可以编辑post2.
validation data-security firebase firebase-security firebase-realtime-database
我正在构建一个使用谷歌云 API(例如谷歌云存储)的应用程序。为了使用 api 对应用程序进行身份验证,我需要将keyfile.json包含身份验证凭据的文件的路径传递给 GCloud Api 初始化脚本。IE
const storage = new Storage({
keyFilename: path.join(__dirname, '../../keyfile.json'),
});
Run Code Online (Sandbox Code Playgroud)
我将keyfile.json放入 NestJSsrc文件夹,但是当我构建应用程序时,该文件不会复制到dist.
在 NestJS 中处理静态文件复制到 dist 的推荐方法是什么?
static google-cloud-storage google-cloud-platform gcloud nestjs
angular ×8
firebase ×5
angularfire2 ×4
apache-spark ×3
scala ×3
ngrx ×2
redux ×2
rxjs ×2
action ×1
angular-cli ×1
angular6 ×1
cross-join ×1
database ×1
dataframe ×1
gcloud ×1
ionic2 ×1
lazy-loading ×1
mongodb ×1
nestjs ×1
reactjs ×1
static ×1
store ×1
validation ×1