mdSidenav服务可以'当一个组件's在Angular组件内部

mdSidenav service can't find a component when it's inside an Angular component

本文关键字:组件 内部 一个 Angular 服务 mdSidenav      更新时间:2023-09-26

我正试图弄清楚为什么具有<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或任何事件后需要服务的情况。。。

顺便说一句,我会留下这个问答;对新答案持开放态度,这样我们就可以理解为什么我的场景不起作用。。。