Angular UI Router在运行时替换视图

时间:2014-07-02 11:57:51

标签: javascript angularjs angular-ui angular-ui-router

我正在尝试在运行时 - 服务内部更改父视图模板。

我的应用配置如下:

$stateProvider
.state('base', {
    abstract: true,
    views: {
        'header':       {
            controller: 'HeaderCtrl',
            templateUrl: 'header.html'
        },
        '': {
            template: '<div ui-view="main"></div>'
        }
    }
})
.state('base.home', {
    url: '/',
    views: {
        'main': {
            controller: 'SomeContentCtrl',
            templateUrl: 'content.html'
        }
    }
});

然后我有一个从SomeContentCtrl调用的服务,它将监听一个事件,并且在这样的事件中我想将标头的templateUrl设置为null。类似的东西:

angular
    .module('RemoveTemplate', [ ])
    .factory('RemoveTemplate', ['$window', '$view', '$state',
        function RemoveTemplate ( $window, $view, $state ) {

            var windowElem  = angular.element($window);

            var listen   = function ( ) {
                windowElem.on('RemoveTemplate', function ( event ) {
                    $view.load('header@base', {
                        templateUrl: null
                    });

                    // Trying both, even tried without refreshing the state
                    $state.reload();
                    $state.go('wh.lobby');
                });
            };

            return {
                listen:  listen
            };

        }
    ]);
});

但这根本不起作用。有没有人之前遇到过类似的用例?

由于

2 个答案:

答案 0 :(得分:3)

您可以指定每次导航到状态时运行的templateURL函数。

https://github.com/angular-ui/ui-router/wiki/Quick-Reference#template-templateurl-templateprovider

此方法可以检查是否应该提供网址或其他内容; 例如:

$stateProvider.state('home', {
        url: '/',
        templateUrl: function () {
            if (header === true) {
                return 'app/templates/home.html';
            } else {
                return somethingElse;
            }
        }
    })

答案 1 :(得分:0)

如果你想在不删除html的情况下“隐藏”标题部分,请尝试在标记标记内使用ng-show指令并检查实际状态。

<div ng-show="state.is('base')">

这样你只需要在控制器中注入$ state服务。 当状态为 base 时,div将显示,如果您导航到子状态,它将隐藏。

P.S。 $ state.is返回一个布尔值,此方法也适用于ng-if。