要么我没有得到模式,要么我的设计是错误的。
使用angular2-beta0,typescript
基本上我已经设置了一个非常基本的应用程序,其中一个根组件是一个控制主视图的路由器,然后在某些页面上我有一个子路由器来控制该组件上的子视图。
我似乎正在努力解决的问题是如何通过组件之间的通信来构建事物。由于应用程序目前以一种对我来说具有逻辑意义的方式进行排列,主要路径的视图没有任何共同点,在子路径视图中它们都共享相同的侧面导航和标题。我遇到的问题似乎是回传给子视图的父视图。似乎是孩子在路由器插座中它不能获得父组件的依赖性。我已经查看了自定义事件,但这些事件似乎只在绑定到模板时才起作用。唯一的另一种选择似乎是服务,但这对我来说似乎是理所当然的,我希望父组件能够控制子组件的状态。
任何一些示例代码......
@Component({
selector: 'app'
})
@View({
template: '<router-outlet></router-outlet>',
directives: [ROUTER_DIRECTIVES]
})
@RouteConfig([
{ path: '/', as: 'Login', component: LoginForm },
{ path: '/main/...', as: 'Main', component: Main}
])
class App {
constructor(private _router: Router) {
}
}
bootstrap(App, [ROUTER_PROVIDERS, provide(APP_BASE_HREF, { useValue: '/' })]);
@Component({
selector: 'main'
})
@View({
templateUrl: '/client/main/main.html',
directives: [ROUTER_DIRECTIVES, NgClass, Menu, Main]
})
@RouteConfig([
{ path: '/', as: 'Clear', component: StateClear },
{ path: '/offer', as: 'Offer', component: StateOffer }
])
export class Main {
constructor(private _router: Router) {
}
}
@Component({
selector: 'state-clear'
})
@View({
templateUrl: '/client/bookings/state-clear.html'
})
export class StateClear {
constructor(main: Main) {
}
}
我在DI中遇到的错误是......
EXCEPTION:无法解析StateClear的所有参数(未定义)。确保它们都有有效的类型或注释。
事件没有错误,因为我没有看到如何在模板外听。
答案 0 :(得分:3)
所以你可能想做的不是将DI与父组件一起使用。
就像你在这里一样:
export class StateClear {
constructor(main: Main) {
}
}
您可能只想创建一个服务来处理您想要在路由/组件级别共享的数据。
@Injectable()
export class UserSettingsService {
// Application wide settings/config should be instatiated here
// with a call from OnInit we can set all of these values.
constructor() { }
public iId: number;
public userName: string;
public isLoggedIn: boolean;
public firstName: string;
public lastName: string;
public permissions: string[];
getUser(userName:string) {
// with an AJAX request get user Auth.
return Promise.resolve(api.getUserAuth(userName));
}
}
此UserSettingsService现在可以作为应用程序级服务添加到您的引导程序中,然后可以传递到您想要与之共享的所有路由中。 dependency-injection-in-angular-2
bootstrap(App, [ROUTER_PROVIDERS, UserSettingsService, provide(APP_BASE_HREF, { useValue: '/' })]);
然后执行以下操作以访问组件中的数据。
@Component({
selector: 'state-clear'
})
@View({
templateUrl: '/client/bookings/state-clear.html'
})
export class StateClear {
userName:string;
userId:int;
isLoggedIn:boolean;
constructor(private _userSettings: UserSettingsService) {
// Not that you would do this here again but just for an example that the data is retrievable here.
this.userName = this._userSettings.userName;
this.userId = this._userSettings.iId;
}
}