gpt4 book ai didi

javascript - 我的子组件如何在 Angular 2 中调用父组件的方法?

转载 作者:数据小太阳 更新时间:2023-10-29 05:29:19 24 4
gpt4 key购买 nike

背景

假设我有一些父组件,称它为 MatchList,其中显示了一个 Hero 对象列表,等等。每个 Hero 对象都有显示在某个表中的属性。现在假设我还为每个 Hero 设置了一个按钮,用于更新路线、加载新 View 并显示更多详细信息。

之前

http://heroic.com/match-list

之后

http://heroic.com/hero-84

问题

我的问题本质是这样的:我想从我的 MatchList 模板中的按钮调用路由器的 navigate() 方法,但是当我尝试时收到以下错误这样做:

EXCEPTION: Error during evaluation of "click"BrowserDomAdapter.logError @ ... angular2.dev.js:21835 ORIGINAL EXCEPTION: TypeError: l_context.setPath is not a function... angular2.dev.js:21835 TypeError: l_context.setPath is not a function at ...

换句话说 看起来我无法在子模板中引用父组件的路由器方法。

那么,在 Angular 2 中,子组件访问父组件(或“上下文”)方法的正确和最佳方式是什么?

我希望解决方案比

class parent {

child: Child;

constructor(...) {

...

this.child.parent = this;

}
}

示例代码

编辑我将模板按钮更改为

(^click)="setPath(match.match_id)"

我不再收到错误消息,但没有任何反应 - 我什至没有收到确认点击的控制台日志。


到目前为止我所拥有的片段。

//父级

    @Component({
selector: 'dota-app',
directives: [Home, MatchesView, ROUTER_DIRECTIVES],
templateUrl: 'AppView.html'
})
@RouteConfig([
{ path: '/', component: Home, as: 'Home' },
{ path: '/matches', component: MatchesView, as: 'Matches' },
{ path: '/match-details', component: MatchDetailsView, as: 'MatchDetails'}
])
export class RootDotaComponent {

router: Router;

constructor(router: Router) {

this.router = router;

}

public setPath(linkParams: any[]|string): void {

if (typeof linkParams === "string")
linkParams = [linkParams];

this.router.navigate(<any[]>linkParams);

}

}

}

// child

@Component({
selector: 'matches-view',
providers: [DotaRestDao],
})
@View({
templateUrl: './components/MatchesView/MatchesView.html',
directives: [CORE_DIRECTIVES]
})
export class MatchesView {

public result;

private dataService: DotaRestDao;

constructor(dataService: DotaRestDao) {

this.result = { matches: [] };

this.dataService = dataService;

this.dataService.getData({
baseUrl: DotaRestDao.MATCH_HISTORY_BASE
}).subscribe(
res => this.result = res.result,
err => console.log("something wrongable", err),
() => console.log('completed')
);

}

}

//模板

<table class="table">
...
<button (click)="setPath(match.match_id)">Match Detail Route</button>
</table>

最佳答案

在这个问题的上下文中,即调用父 router,事实证明答案是微不足道的。参见 this plunker了解详情。

主要的收获是给子组件一个 la

class ChildComponent {

constructor(router: Router) {

...

}

}

创建一个新的路由器,它只是扩展父组件的现有路由器。因此,不需要引用父对象。只需调用 childRouter 的方法,一切都会按预期进行。

关于javascript - 我的子组件如何在 Angular 2 中调用父组件的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33664358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com