Angular2:从 parent 组件调用函数
Angular2: Call function from parent component
我遇到了一个问题,这个问题之前已经提到过很多次了,但是这些解决方案是这样的:
为了简单起见,我想在共享 link 上使用这个示例:
让我们开始吧:
首先,我在 app.module.ts:
中有那些路线
{path: 'dash/:project_id', component: DashProject, children: [
{path: '', component: null},
{path: 'task/form', component: TaskForm},
{path: 'task/:task_id', component: TaskView}
如您所见,DashProject 是我的 parent 其他人是 children。我还在 DashProject 的模板中包含了所需的
<router-outlet></router-outlet>
部分包括 children。
但是在这个提到的例子中我需要包括
<child (notifyParent)="getNotification($event)"></child>
现在我在我的 parent 模板中做了这样的:
<child (notifyParent)="getNotification($event)"></child>
<router-outlet></router-outlet>
问题:当我将 <child (notifyParent)="getNotification($event)"></child>
添加到我的 parent 模板时,child 组件 已经包含在 parent 中,即使它没有被调用通过 URL routing. 当我删除该部分时, parent-child 之间的交互不再起作用。
如果我将它们添加到 child 模板中,我将得到一个永无止境的循环并崩溃。
谁能看到我的问题或知道是什么导致了这个错误?我在网上看到了一些例子,比如上面分享的那个,都是用类似的解决方案,但对我来说行不通。
提前致谢!
亲切的问候,yadbo
看起来您可能正在合并两种不同的技术。
当你想路由到一个组件时使用路由。例如,路由到 dash 项目页面或任务表单页面。通常路由的组件没有选择器,并且不在 HTML 中直接引用。相反,它们出现在 <router-outlet>
.
当您想将一个组件用作另一个组件的子组件时,请使用嵌套组件。例如,在项目页面中显示一组星星而不是评级。嵌套组件必须有一个选择器,并且该选择器在 HTML 中使用(就像您的 <child>
示例。)
当使用嵌套组件时,可以使用@input和@output来实现父子之间的通信。
使用路由组件时,您可以通过传递参数(必需参数、可选参数或查询参数)、使用共享解析器或在服务中设置属性来在组件之间进行通信。
谢谢@DeborahK 的提示,那是我遗漏了。
现在我正在使用共享服务来解决这个问题,我将回调传递给从 child 调用的共享服务。
这是一个例子,至少是想法,它是如何工作的:
export class SharedService {
private callback:any = null;
public constructor() {
}
public getCallback() {
return this.callback;
}
public setCallback(call) {
this.callback = call;
}
}
Parent:
this._shared.setCallback(this.test.bind(this));
Child:
this._shared.getCallback()();
是的,它有效:)
我遇到了一个问题,这个问题之前已经提到过很多次了,但是这些解决方案是这样的:
为了简单起见,我想在共享 link 上使用这个示例:
让我们开始吧: 首先,我在 app.module.ts:
中有那些路线{path: 'dash/:project_id', component: DashProject, children: [
{path: '', component: null},
{path: 'task/form', component: TaskForm},
{path: 'task/:task_id', component: TaskView}
如您所见,DashProject 是我的 parent 其他人是 children。我还在 DashProject 的模板中包含了所需的
<router-outlet></router-outlet>
部分包括 children。
但是在这个提到的例子中我需要包括
<child (notifyParent)="getNotification($event)"></child>
现在我在我的 parent 模板中做了这样的:
<child (notifyParent)="getNotification($event)"></child>
<router-outlet></router-outlet>
问题:当我将 <child (notifyParent)="getNotification($event)"></child>
添加到我的 parent 模板时,child 组件 已经包含在 parent 中,即使它没有被调用通过 URL routing. 当我删除该部分时, parent-child 之间的交互不再起作用。
如果我将它们添加到 child 模板中,我将得到一个永无止境的循环并崩溃。
谁能看到我的问题或知道是什么导致了这个错误?我在网上看到了一些例子,比如上面分享的那个,都是用类似的解决方案,但对我来说行不通。
提前致谢!
亲切的问候,yadbo
看起来您可能正在合并两种不同的技术。
当你想路由到一个组件时使用路由。例如,路由到 dash 项目页面或任务表单页面。通常路由的组件没有选择器,并且不在 HTML 中直接引用。相反,它们出现在 <router-outlet>
.
当您想将一个组件用作另一个组件的子组件时,请使用嵌套组件。例如,在项目页面中显示一组星星而不是评级。嵌套组件必须有一个选择器,并且该选择器在 HTML 中使用(就像您的 <child>
示例。)
当使用嵌套组件时,可以使用@input和@output来实现父子之间的通信。
使用路由组件时,您可以通过传递参数(必需参数、可选参数或查询参数)、使用共享解析器或在服务中设置属性来在组件之间进行通信。
谢谢@DeborahK 的提示,那是我遗漏了。
现在我正在使用共享服务来解决这个问题,我将回调传递给从 child 调用的共享服务。
这是一个例子,至少是想法,它是如何工作的:
export class SharedService {
private callback:any = null;
public constructor() {
}
public getCallback() {
return this.callback;
}
public setCallback(call) {
this.callback = call;
}
}
Parent:
this._shared.setCallback(this.test.bind(this));
Child:
this._shared.getCallback()();
是的,它有效:)