我正试图弄清楚为什么具有<md-sidenav>
指令的Angular .component()
无法从自己的组件控制器中找到。Angular抛出以下错误:
未找到句柄菜单的实例
整个组件是:
function controller($mdSidenav) {
$mdSidenav("menu").open();
}
controller.$inject = ["$mdSidenav"];
components.component("sideAppMenu", {
controller: controller,
controllerAs: "model",
templateUrl: "path/to/template"
});
其模板为:
<md-sidenav class="md-sidenav-left md-whiteframe-z2" md-component-id="menu">
hello world
</md-sidenav>
如果我将整个<md-sidenav>
移动到我的index.html
(即在任何指令/组件之外),$mdSidenav
可以定位整个角度材质组件。
这里出了什么问题?我是不是遗漏了一些细节?
我可以确认整个组件已渲染。也就是说,模板被定位并成功注入。
更新
我可以弄清楚问题出在哪里:这是关于组件生命周期的。如果在达到控制器代码一段时间后,我使用$timeout
尝试访问所谓的角材料组件,$mdSidenav
可以定位该组件:
function controller($mdSidenav, $timeout) {
$timeout(function() {
// OK!!!!!!!!
$mdSidenav("menu").open();
debugger;
},3000);
}
controller.$inject = ["$mdSidenav", "$timeout"];
如果问题是何时访问组件,如果是在初始化控制器时,我应该何时尝试访问角材料组件?
我可以使用md-is-locked-open
<md-sidenav>
指令/组件属性来解决我的问题。
由于我只是想锁定整个应用程序生命周期打开的菜单,这对我来说很好。
我怀疑Angular Material开发人员没有涵盖我的用例,而是在视图已经加载并执行click
或任何事件后需要服务的情况。。。
顺便说一句,我会留下这个问答;对新答案持开放态度,这样我们就可以理解为什么我的场景不起作用。。。