如何动态使用angularjs ng-outlet

Posted

技术标签:

【中文标题】如何动态使用angularjs ng-outlet【英文标题】:How to use angularjs ng-outlet dynamically 【发布时间】:2015-08-22 17:49:18 【问题描述】:

从几天开始,我正在开发 angularjs 应用程序。经过 2 天的头脑风暴,我现在知道如何使用 angularjs 的新路由器+组件+ng-outlet 的东西。

现在,在幸福片刻之后,又出现了一个奇怪的问题。那就是-在我的应用程序中,主要有两种页面。

登陆页面(我只需要 1 个 ng-outlet) 其他页面(我需要 3 ng-outlet。就像顶部导航栏、侧边栏和主要内容区域。见下面的截图)

所以我想要的是,当用户从登录页面移动到其他页面时,我如何在 index.html 文件中动态创建 3 ng-outlet。这样,我就可以填充顶部导航栏组件、侧边栏组件和主要内容区域。

任何线索,如何处理这种情况?

感谢和问候

index.html 代码

<body layout="column" ng-controller="AppCtrl">    
    <div ng-outlet="navigation" id="navigation">
    </div>


    <div layout="row" flex>
        <md-sidenav layout="column" class="md-sidenav-left md-whiteframe-z2" md-component-id="left" md-is-locked-open="$mdMedia('gt-sm')">
            <div ng-outlet="sidebar">
            </div>  
        </md-sidenav>

        <div layout="column" flex id="content">
            <md-content layout="column" flex class="md-padding">
                <div ng-outlet="main">
                </div>
            </md-content>
        </div>
    </div>

    <script src="bower_components/angular/angular.min.js"></script>
    <script src="bower_components/angular-animate/angular-animate.min.js"></script>
    <script src="bower_components/angular-aria/angular-aria.min.js"></script>

    <script src="bower_components/angular-material/angular-material.min.js"></script>
    <script type="text/javascript" src="assets/js/router.es5.js"></script>
    <script type="text/javascript" src="assets/js/app.js"></script>
</body>

【问题讨论】:

你的主要组件本质上是根组件吗? 【参考方案1】:

我遇到了同样的问题,我的解决方法是创建一个 void 组件,带有一个空控制器和这个 template: "&lt;div style='display:hidden;'&gt;&lt;/div&gt;"

所以,每当我想让一个组件“消失”时,我都会为它分配 void 组件,如下所示:

function appController($router) 
    $router.config([
         path: '/', redirectTo: '/splash' ,
         path: '/splash', components:  left: 'void', main: 'splash'  ,
         path: '/left', components:  main: 'splash', left: 'left'  
    ]);

希望对你有帮助, 雷纳托

【讨论】:

您的解决方案看起来不错。但是我正在使用 Angular Material design(material.angularjs.org/latest/#) 并且每当我尝试实现您的技术材料设计 CSS 时都无法正常工作。上面我已经包含了我的 index.html 代码。为了实现您的技术,所有材料设计代码都应该在“ng-outlet”内,如果我这样做,所有材料设计的 CSS 都不起作用。 是的,我在使用 angular-material 时遇到了同样的问题。是的,我将该内容移到了组件的模板中。然而,即使您可以在路由定义中使用 null 或 undefined 来指定其可见性。你最终会得到 ng-outlet “隐藏”,所以问题仍然存在。我从你的代码中看到你正在实现一个 md-sidenav,考虑到 sidenav 它本身是一个组件,所以拥有它是有意义的,将 md-sidnav 移动到组件模板。 根据 Pete Bacon 的说法,这在当前的 ngComponentRouter 中不可用。

以上是关于如何动态使用angularjs ng-outlet的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS + JQuery:如何在 angularjs 中获取动态内容

如何使用 angularjs 处理具有动态过滤添加的高级搜索?

如何使用angularjs动态添加行?

如何使用angularjs动态显示表中的对象数组?

如何让 angularJS 动态内容显示在 iframe 中?

AngularJs:如何对指令创建的动态元素应用表单验证