引用components controller并不是什么新鲜事,以前的指令允许它,这根本不是问题,必须要有这样的特性,
ng-ref
只是一个帮助您从模板侧执行此操作的工具(与Angular2+执行此操作的方式相同)。
不过,如果您需要准备好子组件,则应该使用
$postLink()
而不是
$onInit
.
$postLink
在组件与子组件链接后调用,这意味着
天然气参考
当它被调用时就准备好了。
所以你要做的就是
onInit
就像这样:
̶$̶o̶n̶I̶n̶i̶t̶(̶)̶ ̶{̶
$postLink() {
console.log("onInit", this.pl);
this.initPL = this.pl || 'undefined';
this.sample = this.pl || 'undefined';
this.getSample = () => {
this.sample = `[${this.pl.box1},${this.pl.box2}]`;
}
}
$postLink()
-在链接此控制器的元素及其子元素后调用。与post-link函数类似,此钩子可用于设置DOM事件处理程序和直接进行DOM操作。请注意,包含templateUrl指令的子元素将不会被编译和链接,因为它们正在等待其模板异步加载,并且它们自己的编译和链接已挂起,直到发生这种情况。这个钩子可以被认为类似于
ngAfterViewInit
和
ngAfterContentInit
有角度的钩子。由于AngularJS的编译过程非常不同,因此没有直接映射,升级时应小心。
裁判。:
Understanding Components
完整的工作片段可以在下面找到(我删除了所有
console.log
为了让它更清楚):
angular.module("app",[])
.controller("ctrl", class ctrl {
constructor() {
//console.log("construct")
}
$postLink() {
//console.log("onInit", this.pl);
this.initPL = this.pl || 'undefined';
this.sample = this.pl || 'undefined';
this.getSample = () => {
this.sample = `[${this.pl.box1},${this.pl.box2}]`;
}
}
})
.component("player", {
template: `
<fieldset>
$ctrl.box1={{$ctrl.box1}}<br>
$ctrl.box2={{$ctrl.box2}}<br>
</fieldset>
`,
controller: class player {
constructor() {
//console.log("player",this);
}
$onInit() {
//console.log("pl.init", this)
this.box1 = true;
this.box2 = false;
}
},
})
<script src="//unpkg.com/angular@1.7.1/angular.js"></script>
<body ng-app="app" ng-controller="ctrl as vm">
Initial vm.pl = {{vm.initPL}}<br>
Sample = {{vm.sample}}<br>
<button ng-click="vm.getSample()">Get Sample</button>
<br>
<input type="checkbox" ng-model="vm.pl.box1" />
Box1 pl.box1={{vm.pl.box1}}<br>
<input type="checkbox" ng-model="vm.pl.box2" />
Box2 pl.box2={{vm.pl.box2}}<br>
<player ng-ref="vm.pl"></player>
</body>