- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个 Angular 应用程序,需要访问组件 3 中组件 1 的属性。组件 1 和组件 3 之间的关系是祖孙关系。
我已经成功地直接实现了父/子组件之间的通信(即从组件 1 到组件 2 以及从组件 2 到组件 3(注意组件 3 是组件 2 的子组件,组件 2 是组件 1 的子组件)。我只需要单向通信(即从子组件中的(大)父组件访问属性)。
您可以在下面看到我的应用程序的结构。我也使用共享服务。
组件 1.ts
import { Component, OnInit } from '@angular/core'
import { StrategyService } from './shared/strategy.service'
@Component({
selector: 'strategies-list',
templateUrl: './strategies-list.component.html'
})
export class StrategiesListComponent implements OnInit {
strategies:any[]
constructor(private strategyService: StrategyService) {
}
ngOnInit() {
this.strategies = this.strategyService.getStrategies()
}
}
组件 1.html
<div>
<h1>Strategies</h1>
<hr/>
<strategy-thumbnail *ngFor = "let strategy of strategies" [strategy] = "strategy"> </strategy-thumbnail>
</div>
组件 2.ts
import { StrategyService } from './shared/strategy.service'
@Component ({
selector:'strategy-thumbnail',
templateUrl:'./strategy-thumbnail.component.html',
styles: [`
.pad-left { margin-left: 10px; }
.well div { color: #bbb; }
`]
})
export class StrategyThumbnailComponent implements OnInit {
@Input() strategy:any
psets:any
constructor(private strategyService: StrategyService) {
}
ngOnInit() {
this.psets =this.strategyService.getParameterSets(this.strategy.Name)
}
}
组件 2.html
<div class="well">
{{strategy?.Name}}
<param-set *ngFor = "let pset of psets" [pset] = "pset"> </param-set>
</div>
组件 3.ts
import { Component, Input, OnInit } from '@angular/core'
import { StrategyService } from '../strategies/shared/strategy.service'
@Component ({
selector:'param-set',
templateUrl:'./param-set.component.html'
})
export class ParamSetComponent {
@Input() pset: any
@Input() strategy: any
returns: any
constructor(private strategyService: StrategyService) {
}
ngOnInit() {
this.returns = this.strategyService.getReturns(***SomeStrategyName***,this.pset.Name)
}
}
组件 3.html
<div> {{pset?.Name}} </div>
<return-vector *ngFor = "let return of returns" [return] = "return"> </return-vector>
组件 4.ts
import { Component, Input } from '@angular/core'
@Component ({
selector:'return-vector',
templateUrl:'./return-vector.component.html'
})
export class ReturnVectorComponent {
@Input() strategy:any
@Input() pset: any
@Input() return: any
}
组件 4.html
<div>Period: {{return?.period}}, Return: {{return?.return}}</div>
策略.服务.ts
import { Injectable } from '@angular/core'
@Injectable()
export class StrategyService {
getStrategies() {
return STRATEGIES
}
getStrategy(Name:string) {
return this.getStrategies().find(strat => strat.Name === Name)
}
getParameterSets (Name: string) {
return this.getStrategy(Name).PSETS
}
getParameterSet (StrategyName, PSetName) {
return this.getParameterSets(StrategyName).find(pset => pset.Name === PSetName)
}
getReturns (StrategyName, PSetName) {
return this.getParameterSet(StrategyName, PSetName).Returns
}
getReturn(StrategyName, PSetName, Period) {
return this.getReturns(StrategyName, PSetName).find(returnperiod => returnperiod.period === Period)
}
}
const STRATEGIES = [
{ "Name": "SomeStrategyName1", "PSETS: [{"Name":"SomePSetName1", "Returns": [{ "period": "someperiod1", "return" : somenumber1}, {"period": "someperiod2", "return" : somenumber2}]}, {"Name":"SomePSetName2", "Returns": [{ "period": "someperiod3", "return" : somenumber3}, {"period": "someperiod4", "return" : somenumber4}]}]},
{ "Name": "SomeStrategyName2", "PSETS: [{"Name":"SomePSetName3", "Returns": [{ "period": "someperiod5", "return" : somenumber5}, {"period": "someperiod6", "return" : somenumber6}]}, {"Name":"SomePSetName4", "Returns": [{ "period": "someperiod3", "return" : somenumber3}, {"period": "someperiod4", "return" : somenumber4}]}]},
...
{ "Name": "SomeStrategyNameK", "PSETS: [{"Name":"SomePSetName3", "Returns": [{ "period": "someperiod5", "return" : somenumber5}, {"period": "someperiod6", "return" : somenumber6}]}, {"Name":"SomePSetName4", "Returns": [{ "period": "someperiod3", "return" : somenumber3}, {"period": "someperiod4", "return" : somenumber4}]}]}]
在上面的代码中,除一件事外,一切都按预期工作:在组件 3.ts 中,我想访问一些特定的返回集。如果我输入一些特定的策略名称(例如“SomeStrategyName1”),我的代码就可以工作。但我希望这个策略名称特定于我正在循环的策略。
我尝试用 this.strategy.Name 替换“SomeStrategyName1”,因为我已经两次使用输入参数(一次在组件 3 中,一次在组件 2 中)。在组件 2 中,这有效:在 ts 文件中调用 getParameterSets 函数时,我可以成功访问 this.strategy 的 Name 属性。
然而,在组件 3 中,这不起作用。我收到 TypeError: Cannot read property 'Name' of undefined at ParamSetComponent.ngOnInit。
最佳答案
您需要将组件 2 模板中的 strategy
传递给 param-set
组件,因为它需要一个:
<div class="well">
{{strategy?.Name}}
<param-set
*ngFor="let pset of psets"
[pset]="pset"
[strategy]="strategy">
</param-set>
</div>
您还必须对组件 3 等执行相同的操作...
<div> {{pset?.Name}} </div>
<return-vector
*ngFor="let return of returns"
[pset]="pset"
[strategy]="strategy"
[return]="return">
</return-vector>
关于javascript - 从 Angular 中的孙组件访问祖组件属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57028508/
file.xml 示例。 我更喜欢使用elementtree来解析。根节点获取为 tree=xml.etree.El
有什么好的方法可以直接将 SIGUSR 发送给孙子?例如。我有一些进程树: 0 / \ 1 2 \ 3 并且需要从0发送一个信号到3。 我
我正在使用lxml ,使用html库的模块。 如何获取包含具有某些特征的元素的元素? 例如: Welcome other Bye Bye another 如何选择 包含 Wel
我将直接切入,简短且具有描述性: C++、Windows API 我正在使用 CreateProcess 创建子进程以运行外部(命令行)应用程序。我已经建立了超时,如果到那时子进程还没有返回正常执行,
我有一个 XML 需要解析,这对我来说非常棘手。 1234 FOO ... 我想遍历此 XML 并在 b
我有一个父 div,单击它会显示一个子 div,再次单击父 div 将切换该子 div 并再次隐藏它。我在那个子 div 中有一个开关切换,它将在场景后面用作复选框。我的代码的问题是,当我点击那个开关
我有一个这样的数据路径 events -KntTJCVBtbrb79dHemC dateStamp: 1498747689858 admin: "rPxwIzE
我正在寻找一种将属性更改事件从孙子级传播到其父级的正确方法。假设我们有一些树结构,当其中一个叶子的某些属性发生变化时,应该通知这棵树的根。我想,一种方法是将属性更改监听器从节点添加到其子节点,然后将事
我有一个 Bash 脚本(Bash 3.2,Mac OS X 10.8)可以并行调用多个 Python 脚本,以便更好地利用多个内核。每个 Python 脚本都需要很长时间才能完成。 问题是,如果我在
我有一个名为 Device 的对象。 Device 可以有一个父 Device。一个 Device 也可以有 n 个子 Devices。 我有一个下拉列表,其中显示了所有可选择的设备。我可以很容易地获
我正在尝试使用此 cron 作业每隔一周运行一个脚本。 (/ect/crontab) 45 8 * * mon root expr `date +%U` % 2 >/dev/null || /home
我正在从事 Backbone/Marionette 项目。该项目实现了一种在从服务器加载数据后将数据缓存在本地内存中的方法。因此,可以在项目内随时随地访问数据。 这让我想知道在我的案例中填充数据以查看
我是一名优秀的程序员,十分优秀!