在子组件中如何从父组件访问变量?
在子组件中如何从父组件访问变量?
我正在尝试使用两个组件在Angular应用程序中抽象出一个票据列表构建的概念。
第一个组件(智能组件)使用$http来获取数据,并将其放入父组件(gather)控制器中的一个名为populatedList的数组中。这部分工作正常。
第二个组件(笨组件)对于父组件中populatedList变量中的每个键值对,应该创建一个列表项。然而,尽管我将它注册到了同一个模块中,但第二个组件的onInit()函数从未被调用。当我通过浏览器查看HTML模板代码时,它也没有实例化。我在控制台上没有收到任何错误提示,那么我做错了什么?为什么我的第二个组件不起作用,即使我使用“require”从父组件中获取信息。
我最终让我的子组件看到了从pullTicketCtn控制器的populated "tickets"变量中的数据(通过屏幕截图证明),但是当我尝试console.log(vm.parentComp.tickets)或console.log(vm.tickets)时,它给了我一个空数组,即使我刚刚做了console.log(vm.parentComp)和console.log(vm)并通过控制台看到了数组中的值。
所以现在console.log(vm.parentComp.tickets)和console.log(vm)都显示我的displayTicketsCnt和pullTicketsCnt控制器都有tickets变量,但是我无法在子组件中访问它,也无法console.log()它。我做错了什么?
组件:
// 父组件/智能组件
var gather = {
controller: pullTicketsCnt,
controllerAs: 'pullTicketsCntAs',
bindings: {
tickets: '=',
client_id: '='
}
};
// 子组件/笨组件
var list = {
transclude: true,
require: {
parentComp: '^gather'
},
template: [
'
- ',
- ',
' {{key}}',
'
'
',
'
'
].join(''),
controller: displayTicketsCnt,
controllerAs: 'displayTicketsCntAs'
};
控制器:
// 父控制器
function pullTicketsCnt($http) {
$http ...
this.tickets = temp.slice(0); // 获取填充数据的数组
...
}
// 子控制器
function displayTicketsCnt() {
var vm = this;
vm.$onInit = function() {
console.log('LIST-DATA组件已初始化');
console.log(vm.parentComp);
console.log(vm);
vm.populated = (vm.parentComp.tickets).slice(0);
console.log(vm.parentComp.tickets); // 这两行代码打印出空数组
console.log(vm.populated);
}
}
声明:
var app = angular.module('ticket', [])
.controller('listCtrl', listCtrl)
.component('gather', gather)
.component('list', list);
HTML:
Angular (1.5) JS中的一个问题是如何在子组件中访问父组件的变量。原因是在子组件中访问父组件的变量需要一些额外的配置和代码。
解决方法是在子组件中使用`require`属性来访问父组件的控制器。代码如下:
这里的`parentComponent`是父组件的名称。
另一个解决方法是在子组件中使用`$onChanges`方法来监视父组件的变化。代码如下:
this.$onChanges = function() { // Access parent component's variable here };
需要注意的是,这里使用的是`$onChanges`方法而不是`onInit`方法。
另外,还有一个错误的解决方法是在`require`属性中只使用一个`^`来访问父组件的控制器。正确的写法是使用两个`^^`,代码如下:
require: { parent: '^^parentComponent' }
最后,还有一个需要注意的地方是将`transclude`属性放在正确的组件中。应该将`transclude: true`放在父组件中而不是子组件中,代码如下:
angular.module('app').component('parentComponent', { transclude: true, ... });
通过以上的配置和代码,就可以在子组件中访问父组件的变量了。