使用额外视图扩展父状态

时间:2015-04-23 16:01:51

标签: angularjs angular-ui-router

使用:AngularJS和UI-Router。

我正在尝试创建一个包含两个视图的页面:menumain。一个是菜单,另一个是可能的内容。但是,我不希望每次都在所有状态中定义两个视图。 menu视图不会经常更改。所以我创建了一个父“root”状态,它只包含menu视图。然后其他州从中得出并添加适当的观点。

代码如下(在文件app.js中):

angular
    .module('Admin', ["ui.router"])
    .config(["$stateProvider", function($stateProvider) {
        $stateProvider.state('root', {
            abstract: true,
            views: {
                "menu": {
                    templateUrl: "../static/partials/menu.html",
                    controller: "MenuController"
                }
            }
        }).state('root.main', {
            url: "",
            parent: 'root',
            views: {
                "main": {
                    templateUrl: "../static/partials/landing.html",
                    controller: "MainController"
                }
            }
        }).state('root.login', {
            url: "/login",
            parent: 'root',
            views: {
                "main": {
                    templateUrl: "../static/partials/login.html",
                    controller: "LoginController"
                }
            }
        })
        ;
    }])
    .controller('MainController', ["$scope", "$http", mainController])
    .controller('MenuController', ["$scope", "$http", menuController])
    .controller('LoginController', ["$scope", "$http", loginController])
    ;

结果是只显示menu视图。除非我还将其添加到main状态,否则不会显示root视图。谁知道什么是错的?

修改

包含视图的HTML:

<div ng-app="Admin">
    <a ui-sref="root.main">Click me</a>
    <div class="ui menu" ui-view="menu"></div>
    <div class="ui segment">
        <div ui-view="main"></div>
    </div>
    <br>
</div>

<script src="{{ url_for('static', filename='js/menu.js') }}"></script>
<script src="{{ url_for('static', filename='js/main_controllers.js') }}"></script>
<script src="{{ url_for('static', filename='js/app.js') }}"></script>

编辑2

这里有一个类似的问题:UI-Router inheriting views,但这对我不起作用......

编辑3

我设法在plnkr中简单地重现了这个:http://plnkr.co/edit/uYlFgsvq8hQHON8EESEx?p=preview

2 个答案:

答案 0 :(得分:2)

遇到了同样的问题,并使用你的plnkr找到了解决方案。您需要添加&#39; @&#39;视图名称如下所示。

.state('root.main', {
    url: "",
    parent: 'root',
    views: {
        "main@": {
            templateUrl: "../static/partials/landing.html",
            controller: "MainController"
        }
    }
})

答案 1 :(得分:1)

您的整个代码是正确的,只需要通过ui-sref="root.main"ui-sref=".main"

从用户界面调用该路线

<强>标记

<div ng-app="Admin">
    <a ui-sref="root.main">Click me</a>
    <div class="ui menu" ui-view="menu"></div>
    <div class="ui segment">
        <div ui-view="main"></div>
    </div>
    <br>
</div>