我有一个像这样的动态块:
dynamic "origin" {
for_each = var.ordered_cache_behaviors
content {
domain_name = "${origin.value.s3_target}.s3.amazonaws.com"
origin_id = "S3-${origin.value.s3_target}"
}
}
Run Code Online (Sandbox Code Playgroud)
我的列表定义如下:
"ordered_cache_behaviors": [
{
"path_pattern": "/my-app*",
"s3_target": "${local.default_s3_target}",
"ingress": "external"
}
]
Run Code Online (Sandbox Code Playgroud)
在我的动态块中,我只想在这个条件为真时渲染该块origin.value.s3_target !== var.default_s3_target
如何以及在何处将条件添加到动态块?请注意,块的渲染由当前迭代对象的值控制,而不是由完全排除 for 循环的某个变量控制。
我想迭代所有内容并有条件地排除某些项目。所以用 Javascript 写它看起来像这样:
for (origin in ordered_cache_behaviors) {
if (origin.s3_target !== default_s3_target) {
renderContent();
} else {
console.log('Content was skipped!');
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个自动完成 HTTP 调用和一个执行搜索 HTTP 调用...我需要自动完成调用在触发执行操作时中止。我现在正在做的是使用这样的主题:
private onExecute$ = new Subject();
Run Code Online (Sandbox Code Playgroud)
在我的自动完成方法中:
executeAutoComplete(e) {
this.myService.searchAutoComplete(e.criteria)
.pipe(
takeUntil(this.onDestroy$),
takeUntil(this.onExecute$),
map(
// continue with more code
Run Code Online (Sandbox Code Playgroud)
然后在我的执行方法中我发出信号:
executeSearch(e) {
console.log('triggering onExecute signal');
this.onExecute$.next();
// other code
}
Run Code Online (Sandbox Code Playgroud)
所以在我的控制台中,我看到“触发 onExecute 信号”,但自动完成结果在完整搜索开始执行后返回,我认为一旦我发出信号,takeUntil 就会中止链?这是行不通的。
因此,本质上我试图阻止的行为是,当用户触发搜索时,自动完成结果不应返回并打开下拉列表,因为它不再相关。
我在这里缺少什么?
编辑 -
订单实际上是问题所在,因为总是在自动完成之前调用执行的去抖时间,订单无论如何都可能是不可预测的。没有意识到如果 Observable 链尚未激活, onExecute.next() 将会丢失。
我确实也设置了一个 searchLoading 变量,我该如何使用它?
我试过:
takeUntil(Observable.of(this.searchLoading))
Run Code Online (Sandbox Code Playgroud)
这是行不通的,因为它总是正确的!如何将 takeUntil 与动态评估的布尔值一起使用?
编辑2-
使用 takeWhile 来代替:
takeWhile(() => !this.searchLoading))
Run Code Online (Sandbox Code Playgroud) 我有一个第三方库组件,我试图通过在某个点添加一些额外的标记来自定义该组件。我正在使用结构指令来执行此操作,目前我正在使用渲染器以编程方式添加节点和设置节点样式,如下所示:
const headerDiv = this.newDiv();
el = this.nativeElement.querySelector('div.ui-dropdown-items-wrapper');
this.renderer.appendChild(el, this.renderer.createText('sometext'));
private newDiv(): Element {
return this.renderer.createElement('div');
}
Run Code Online (Sandbox Code Playgroud)
标记就像这样:
<div #containerDiv>
<child-component *myStructuralDirective>
</child-component>
</div>
Run Code Online (Sandbox Code Playgroud)
有没有办法直接在父组件的标记中定义<ng-template>并使用渲染器在某个点注入它?像这样的东西:
<div #containerDiv>
<child-component *myStructuralDirective>
</child-component>
</div>
<ng-template #footer>
<p>Some other markup</p>
</ng-template>
Run Code Online (Sandbox Code Playgroud)
然后在我选择的某个点将 #footer 的内容注入到子组件中。注意 - 我无法访问该子项,因为它是编译的第 3 方库。
其要点是,我试图看看是否有更好的方法将标记定义为模板变量,我可以在结构指令中使用该变量,访问该模板并将其注入子组件中的某个点。
编辑 - 我正在查看ViewContainerRef.insert,不幸的是,这只能根据其他ViewRefs 的位置插入模板。由于我无法更改第 3 方组件的标记,因此我可以定义 ang-container来标记插入点,并且只能使用 CSS 选择器。不确定是否有办法根据元素位置插入模板。我知道这是两个离散的概念(Angular View 抽象与直接 DOM 插入),所以我对这可以完成并不乐观!
Angular 和 Rx 新手,试图理解这一点……我的应用程序对 UI 事件做出反应,这导致调用返回 Observable 的 HTTP 服务。我像这样订阅它:
this.myXYZService.search(query)
.map(r => { // some code })
.subscribe(r => { //some code });
Run Code Online (Sandbox Code Playgroud)
假设该事件再次触发,并导致对同一 HTTP 服务进行第二次调用,该服务将在第一次调用完成之前返回一个全新的 Observable。
现在,据我所知,我可以使用 switchMap 而不是 map 来丢弃旧的 Observable 并在新的 Observable 上操作?还是我理解错误?如果在第一个事件已经在链的订阅部分之后触发第二个事件会发生什么?在这种情况下它会不会再切换?并且由于 JS 是同步的,在第二个事件甚至开始处理它的链之前,整个第一条链不会执行吗?
我想我对整个事情感到困惑,因为 Observables 的实例是不同的 - Rx 如何跟踪哪个调用要切换?是按函数名吗?假设我有 2 个单独的代码块:
this.myXYZService.search('abcd')
.map(r => { // some code })
.subscribe(r => { //some code });
this.myXYZService.search('efgh')
.map(r => { // some code })
.subscribe(r => { //some code });
Run Code Online (Sandbox Code Playgroud)
如果我在上面两个都使用 switchMap 会发生什么?第二个调用会取消第一个调用吗?