[英]Angular 2, mystery with dependency injection
我认为自己是ng2专家(非常喜欢我的第二个应用程序),但是偶尔我也会碰到一个陷阱……这是一个
我有一个名为simpleGridTable的简单表组件:
<simpleGridTable #userSimpleGridTable>
<thead>
<tr>
<th sortableHeader="name" [sort]="sort">name</th>
<th sortableHeader="businessId" [sort]="sort">business</th>
<th>access keys [0-7]</th>
<th>privileges (id)</th>
<th>privileges (name)</th>
</tr>
</thead>
<tbody>
<tr class="simpleGridRecord" [table]="userSimpleGridTable" simpleGridRecord *ngFor="#item of m_businesses | OrderBy:sort.field:sort.desc; #index=index" [item]="item" [index]="index">
<td style="width: 20%" simpleGridData (labelEdited)="onLabelEdited($event,'name')" editable="true" field="name" [item]="item"></td>
<td style="width: 8%" simpleGridData field="businessId" [item]="item"></td>
<td style="width: 20%" simpleGridDataChecks (changed)="setAccessMask($event)" [item]="item" [checkboxes]="getAccessMask(item)"></td>
<td style="width: 12%" simpleGridData field="privilegeId" [item]="item"></td>
<td style="width: 40%" simpleGridDataDropdown [testSelection]="selectedPriveleges()" (changed)="setPriveleges($event)" field="name" [item]="item" [dropdown]="m_priveleges"></td>
<!-- <td simpleGridDataImage color="dodgerblue" [field]="item.getKey('studioLite') == '0' ? 'fa-circle' : 'fa-circle-o'" [item]="item"></td> -->
</tr>
</tbody>
在它里面,我有一个simpleGridRecord,您可以在上面看到其指令:
<tr class="simpleGridRecord" [table]="userSimpleGridTable" simpleGridRecord *ngFor="#item of m_businesses | OrderBy:sort.field:sort.desc; #index=index" [item]="item" [index]="index">
simpleGridRecord的组件如下(并尝试依赖注入父SimpleGridTable:
import {Component, Injectable, Input, Output, ChangeDetectionStrategy, HostListener, HostBinding, EventEmitter} from 'angular2/core'
从“ ./SimpleGridTable”导入{SimpleGridTable};
@Component({
selector: 'tr[simpleGridRecord]',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<ng-content></ng-content>
`
})
export class SimpleGridRecord {
constructor(tb:SimpleGridTable){
console.log(tb);
}
....
和我的SimpleGridTable组件:
@Component({
selector: 'simpleGridTable',
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [SimpleGridTable],
pipes: [OrderBy],
directives: [COMMON_DIRECTIVES, SimpleGridSortableHeader, SimpleGridRecord, SimpleGridData],
styleUrls: [`../comps/simplegrid/SimpleGrid.css`],
template: `
<table class="table simpleTable">
<ng-content></ng-content>
</table>
`....
})
export class SimpleGridTable {
...
但是由于我收到以下错误,simpleGridRecord似乎无法注入其父表:
我不使用@Inject,就像我正在使用TypeScript一样。我确实将表提供给它的后代
整个类都可以在这里看到: https : //github.com/born2net/studioDashboard/tree/master/src/comps/simplegrid
阅读用TX
肖恩
每当将父级注入子级时,尤其是如果父级和子级是在不同文件中定义的,则很有可能需要将任何对父级类的引用包装在forwardRef
,如下所示:
constructor(@Inject(forwardRef(() => SimpleGridTable) tb: SimpleGridTable ){
console.log(tb);
}
这是一个变通方法,因为在加载子类(必须先加载)时无法加载父类。
也,
我不使用@Inject,就像我正在使用TypeScript一样。我确实将表提供给它的后代
请注意,有些情况下, @Inject
是必要的,打字稿应用程序-其中这是一个。
还需要提及的是,我从未像您在这里看到的那样在providers
包含过组件类型,并且我鼓励您验证它是否在执行您认为正在执行的操作。 无论如何,FWIW,作为代码的阅读者,我对它所做的工作并不十分清楚,而将@Inject
与构造函数注入配合使用的IMHO是一种将父组件注入其子组件的更干净,更惯用的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.