我正在关注tutorial以实现与AngularJS的sidenav
下拉菜单。我在我的应用程序中使用了组件,因此我的布局与提供的示例不同。无法访问元素父控制器
该ul
填充名称存储在一个对象中,但功能失败。我将其缩小以找出错误是由于无法找到指令父元素控制器。
var controller = $element.parent().controller();
当我在控制台登录controller
,它应该显示控制器的功能分别是:
vm.isOpen = isOpen;
vm.toggleOpen = toggleOpen;
vm.autoFocusContent = false;
vm.menu = mainNavService;
vm.status = {
isFirstOpen: true,
isFirstDisabled: false
};
但代替它返回和空对象。是因为不是使用控制器,而是在模块上使用Angular组件方法并使用控制器属性?
问题
为什么试图访问控制器时,不返回属性?
app.component('mainnav', {
templateUrl: 'p3sweb/app/components/app/views/main-nav.htm',
controller: ['userService', 'mainNavService', function(userService, mainNavService){
var vm = this;
vm.isOpen = isOpen;
vm.toggleOpen = toggleOpen;
vm.autoFocusContent = false;
vm.menu = mainNavService;
vm.status = {
isFirstOpen: true,
isFirstDisabled: false
};
function isOpen(section) {
console.log('menu.isSectionSelected(section)')
return menu.isSectionSelected(section);
}
function toggleOpen(section) {
console.log(menu.toggleSelectSection(section))
menu.toggleSelectSection(section);
}
}]
})
app.directive('menuToggle', [ '$timeout', function($timeout){
return {
scope: {
section: '='
},
templateUrl: 'p3sweb/app/components/app/views/main-nav-li.htm',
link: function($scope, $element) {
var controller = $element.parent().controller(); //FAILS
$scope.isOpen = function() {
return controller.isOpen($scope.section)
};
$scope.toggle = function() {
console.log(controller.toggleOpen())
controller.toggleOpen($scope.section);
};
}
};
}])
你尝试声明'mainnav '作为指令而不是组件? –
为什么不把'mainnav'的引用传递给'menuToggle'就像'scope: {section:'=',context:'='}' 并且在你的'main-nav。htm' do' menu-toggle>' –
AdityaParab
通常对于组件,访问父控制器的可接受方式是使用'require'属性。有关更多信息,请参阅[AngularJS开发人员指南 - 组件间通信](https://docs.angularjs.org/guide/component#intercomponent-communication) – georgeawg