2

在某些视图上,我想要一个侧边栏和标题,而有些则不需要。使用 AngularJS,实现这一目标的最佳方法是什么。

我目前考虑的解决方案是在侧边栏和标题 DIV 上使用 ng-if,并在我的控制器中,根据我希望侧边栏和标题出现的视图将 $scope 变量设置为 true 或 false。

一个具体的例子是 Youtube.com。在 Youtube 的主页上,请注意有一个侧边栏和一个带有过滤器的子标题:“看什么”和“音乐”。但是,在任何视频页面上,侧边栏和子标题都不存在。我想在 AngularJS 中实现这一点。

索引.html

    <html ng-app="demoApp">

    <body ng-controller="demoAppMainController">

        <header>
            <ng-include src="'./partials/mainHeader.html'"></ng-include>
            <ng-include ng-if="showSubHeader" src="'./partials/mainSubHeader.html'"></ng-include>
        </header>

        <main>
            <ng-view></ng-view>
        </main>


    </body>
    </html>

讨论板.html

    <div class="discussionBoard" ng-controller="DiscussionBoardController">
         <h2>DiscussionBoard</h2>
    </div>

控制器.js

    var demoAppControllers = angular.module('demoAppControllers', []);

    demoAppControllers.controller('demoAppMainController', ['$scope', function($scope) {
            $scope.showSubHeader = true;
    }]);

    opinionLensControllers.controller('DiscussionBoardController', ['$scope', function($scope) {
            $scope.showSubHeader = false;
    }]);
4

2 回答 2

7

controller我不会在级别上进行配置,而是在级别上进行配置route。并将监听$routeChangeSuccess事件并更新$rootScope.

demoAppControllers.config(function ($routeProvider) {
    $routeProvider.
    when('/home', {
        templateUrl: 'home.html',
        controller: 'HomeController',
        showHeader : true
    }).
    when('/about', {
        templateUrl: 'discuss.html',
        controller: 'DiscussionBoardController',
        showHeader : false
    }).
    otherwise({
        redirectTo: '/home'
    });
}).
run(['$rootScope', function($rootScope) {
    $rootScope.$on("$routeChangeSuccess", function(event, next, current) {
        $rootScope.showHeader = next.$$route.showHeader;
    });
}]);

在您的模板中,您可以只使用ng-if="showHeader". 我觉得它很容易维护。

于 2015-04-20T05:31:43.533 回答
1

ng-if="showHeader == true" 像这样使用

 <ng-include ng-if="showHeader == true" src="'./partials/mainSubHeader.html'"></ng-include>
于 2015-04-20T05:33:58.500 回答