0

我想为我的内容提出两种布局(即horizontalvertical)。所以在选择器中切换会自动导致对应的布局。我当前的JSBin无法完成这种切换:

<html ng-app="flapperNews">
<head>
    <script src="https://code.jquery.com/jquery.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.3.2/angular-ui-router.js"></script>
    <script type="text/ng-template" id="horizontal.tpl">
        {{one}}, {{two}}
    </script>
    <script type="text/ng-template" id="vertical.tpl">
        {{one}}<br>{{two}}
    </script>
    <script>
    var app = angular.module('flapperNews', ['ui.router']);

    app.config(['$stateProvider', function ($stateProvider) {
        $stateProvider
            .state('entry', {
                url: '/',
                templateUrl: "vertical.tpl"
            })
    }]);

    app.controller('MainCtrl', ['$scope', '$state', function ($scope, $state) {
        $scope.one = "one";
        $scope.two = "two";
        $scope.layouts = ["horizontal", "vertical"];
        $scope.$watch('layout', function () {
            $state.go('entry'); // need to amend this such that changing "layout" leads to different template
        })
    }])
    </script>
</head>

<body ng-controller="MainCtrl">
    <select ng-model="layout" ng-options="x for x in layouts"></select>
    <br><br>
    <ui-view></ui-view>
</body>

</html>

另外,我希望解决方案不会在 URL 中显示布局信息;用户只能在网页中查看和选择布局。此外,我不希望通过显示/隐藏<ui-view="horizontal"></ui-view>"<ui-view="vertical"></ui-view>基于选择的解决方案。我更喜欢将布局信息传递给状态以选择相应模板的解决方案(但不在 URL 中公开它)。

有谁知道如何做到这一点?

4

1 回答 1

0
  • 使用非 url 参数,例如layout.
  • 使用templateUrl函数选择模板。

    app.config(['$stateProvider', function ($stateProvider) {
        $stateProvider
            .state('entry', {
                url: '/',
                params: { layout: 'vertical' },
                templateUrl: function(params) { 
                  return params.layout + ".tpl";
                }
            })
    }]);
    

state.go然后您可以使用或切换ui-sref

ui-sref="entry({ layout: 'horizontal' })"

于 2017-02-10T22:39:15.607 回答