【问题标题】:Angular-Ui-Router, nested named views - what am I doing wrong?Angular-Ui-Router,嵌套命名视图 - 我做错了什么?
【发布时间】:2013-11-21 03:35:43
【问题描述】:

我正在尝试使用 ui-router 使用嵌套命名视图来实现一个非常简单的示例,但我无法让它工作。如果有人可以查看这个 jsFiddle - http://jsfiddle.net/thardy/eD3MU/ - 并告诉我我做错了什么,我将不胜感激。

基本思想是这样的: - 我的 index.html 有一个单一的 ui 视图 - 插入的模板有两个,命名为 ui-views - 我正在尝试设置配置以使用模板填充这两个 ui 视图,但我无法让它工作

这是小提琴的核心(模板中的尖括号替换为[]):


        $stateProvider
            .state('test', {
                url: '/test',
                views: {
                    'main': {
                         template:  '[h1]Hello!!![/h1]' +
                                    '[div ui-view="view1"][/div]' +
                                    '[div ui-view="view2"][/div]'
                    }
                }
            })
            .state('test.subs', {
                url: '',
                views: {
                    'view1': {
                        template: "Im View1"
                    },
                    'view2': {
                        template: "Im View2"
                    }
                }
            });

我已经对它进行了几个小时的大量调整(尝试绝对名称等),我快要发疯了。根据文档(至少对我而言)看起来不错,但没有任何简单的示例,而且我一定遗漏了一些明显的东西。

更新 通过从测试状态中删除 url 并将 url: '' 添加到 test.subs 状态,它可以工作。但是添加任何 url 来测试状态会导致它再次失败。在我的现实世界场景中,这些状态都不是根,并且在父状态中根本没有 url 会导致事情无法正常工作。这就像那个状态没有被激活或什么的。根据文档,在 sub 中包含 url: '' 应该会导致它与其父状态一起被激活,但这不是正在发生的事情。

更新 - 解决方案 对于任何想看到它的人 - http://jsfiddle.net/thardy/eD3MU/

【问题讨论】:

    标签: angularjs angular-ui-router


    【解决方案1】:

    以上代码有两个问题:

    1. 正如kju建议的abstract: true,

      抽象状态永远不会被直接激活,但可以提供 继承属性到它的公共子状态。

    2. test.sub 状态下添加url: ""

      使用空的 url 意味着这个子状态会在 其父的 url 被导航到。

    3. 不要手动转换到“测试”

    见下面的代码:

    angular.module('myApp', ['ui.state'])
    .config(['$stateProvider', '$routeProvider',  
        function ($stateProvider, $routeProvider) {
            $stateProvider
                .state('test', {
                    abstract: true,
                    url: '',
                    views: {
                        'main': {
                             template:  '<h1>Hello!!!</h1>' +
                                        '<div ui-view="view1"></div>' +
                                        '<div ui-view="view2"></div>'
                        }
                    }
                })
                .state('test.subs', {
                    url: '',
                    views: {
                        'view1': {
                            template: "Im View1"
                        },
                        'view2': {
                            template: "Im View2"
                        }
                    }
                });
        }])
        .run(['$rootScope', '$state', '$stateParams', function ($rootScope,   $state, $stateParams) {
            $rootScope.$state = $state;
            $rootScope.$stateParams = $stateParams;
    //        $state.transitionTo('test');
        }]);
    

    【讨论】:

    • 无论有无摘要,这都不起作用:true。这是我之前尝试过的众多调整之一。玩 jsFiddle。衷心祝贺任何可以使它工作的人:)
    • 好的,所以如果我根本不添加摘要,请从测试状态中删除 url 并将其添加到 test.subs 状态,它“有效”。一切都出现了,但我认为仍然存在问题。在我的实际代码中,曾经在该控制器中工作的代码不再工作(我调用端点,但没有任何反应)。我需要的是让两个状态都处于活动状态,或者以某种方式将它们组合成一个状态。看到这一点的一个简单方法是让测试状态不是“url:''”,而子状态是“url:''”。它再次完全停止工作(子视图不显示)。
    • @TimHardy 查看我更新的代码。如果您需要激活这两种状态,则需要transitionTo('test.subs') 或转到test.subs 的网址
    • 就是这样!太感谢了。它是基本状态上的“抽象:true”与具有 url:'' 的子状态的组合。基本状态现在可以有任何 url。看我的小提琴以获得最终结果 - jsfiddle.net/thardy/eD3MU
    • @TimHardy 你的小提琴解决了我的问题......我被难住了一段时间。您应该在问题的更新中发布您的工作小提琴。
    【解决方案2】:

    将“abstract: true”添加到“test”状态。如果您随后转换到 test.subs,您将看到子视图。

    【讨论】:

    • 这不起作用。这使得“你好!!!”也消失。您可以在 jsFiddle 中尝试一下。就我而言,测试状态应该并且需要被激活。
    • 另外,也许我不清楚。没有“过渡到子视图”。我希望潜艇在初始页面加载时出现。也许这就是我的问题所在。当用户转到站点的根目录“/”时,所有内容都应该可见 - “Hello!!!”,以及“Im View1”和“Im View2”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多