@并命名@ doesn使用resolve解决相同的状态视图问题

时间:2014-11-09 03:40:53

标签: angularjs angular-ui-router

我有一个名为'index'的状态,根据页面上的ui视图,显示不同的信息并具有不同的templateUrl并共享相同的URL:

    $stateProvider.state('index', {
        url: '/',
        views: {
            'all@': {
                templateUrl: '/templates/partials/all/index',
                controller: function(){
                    console.log('main');
                }
            },
            '@': {
                templateUrl: '/templates/partials/home/index',
                controller: Controllers.Index,
                controllerAs: 'academia',
                resolve: {
                    templates: Preload.go(),
                    academia: ['Info', (Academia: Academia.Services.Info) => {
                        return Academia.get();
                    }],
                    plans: ['Planner', (Planner: ngPlanner.Planner) => {
                        return Planner.init();
                    }]
                }
            }
        }
    });

当页面加载<div ui-view></div>时,它按预期工作(匹配'@'规则)。但是当页面加载<div ui-view="all"></div>时,它不会。

显示问题http://plnkr.co/edit/a2SWbB?p=preview

的傻瓜

来自未命名的@的解决方案不应干扰all@视图。当前解析被拒绝,因为它不属于当前视图(因为在加载页面时没有未命名的视图)。这是一个错误,还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

目前,UI-Router实施由州管理层推动。尽管如此,有一些声音/要求可以分割视图的解析(好吧,不是父视图与子视图 - 但这将在下面讨论) ...我会说,上述Q&amp; A中的当前行为只是正确

首先,上述问题是什么问题?通常,有两个或更多兄弟视图,具有自己的解析定义:

views: {
    'view1': {
          ....
          resolve : { // could fail
        }
    },
    'view2': {
        ...
        resolve:    { // could fail as well
    ...

什么是州?

状态是一组设置,代表状态。 (听起来像self proving statement,但我很认真)。所有设置都是关于状态定义,关于一个特定状态。

我们可以使用更多视图来表示(例如标题和内容) 我们可以使用一些解析语句(对于所有兄弟视图,对于其中一些)来支持这些视图。
我们仍然只有 ONE 州。

就是这样。这是全有或全无。状态是一组,一组设置,所有这些都必须工作/解决 - 或者整个状态都失败。

另一个故事:父母 - 孩子

还有一些要求让视图在解决所有内容后进行渲染。为什么?目前,如果我们直接导航到child状态,则必须在启动状态之前解析所有/两个解析,然后呈现视图。

这可以真正改善。合理。据我所知,计划在以后的版本中发生(我会发誓我已经在UI-Router团队成员的一条评论中看到了 - 但是找不到它)

情况不同。因为1)我们可以先去父母(列表视图)。然后2)选择孩子(细节)。在这种情况下,列表工作正常,细节失败。

所以直接去看孩子应该让父母,下一次失败的孩子...但这是与上述兄弟姐妹不同的故事。

建议:

我的建议是,在resolve中只保留必要的东西,绝对必须为一个州。将其余部分移动到Controllers注入的服务中。这是我的建议和我的方式......