0

我已经配置了以下 ui-router。

app.config(['$stateProvider', function ($stateProvider) {
    $stateProvider
        .state('global.editor', {
            url: '/posts/editor/{id}',
            templateUrl: '/htmls/editor.html',
            controller: 'EditorCtrl',
            resolve: {
                post: ['$stateParams', 'codeService', function ($stateParams, codeService) {
                    return codeService.getPost($stateParams.id)
                }]
            }
        }
        .state('global.new', {
            url: '/new',
            templateUrl: '/htmls/editor.html',
            controller: 'EditorCtrl'
        })
        .state('global.newTRUE', {
            url: '/newTRUE',
            templateUrl: '/htmls/editor.html',
            controller: 'EditorCtrl'
        })           
        .state('global.editor.panels', {
            controller: 'PanelsCtrl',
            params: { layout: 'horizontal' },
            templateUrl: function (params) { return "/htmls/" + params.layout + '.html' }
        }
}])

app.controller('EditorCtrl', ['$scope', '$state', function ($scope, $state) {
    $scope.layout = "horizontal";
    $scope.$watch('layout', function () {
        $state.go('global.editor.panels', { layout: $scope.layout });
    });
}]);

结果,浏览器中的https://localhost:3000/#/new导致(状态global.editor,然后到)状态global.editor.panels

现在,我想添加一个参数connected

  1. 我不希望它显示在网址中
  2. 浏览器中的https://localhost:3000/#/new是 ,浏览器中的connectedhttps : false// localhost:3000/#/newTRUEconnectedtrue
  3. connected可以过去进入控制器EditorCtrlPanelsCtrl
  4. connected可以在 中resolve使用global.editor;理想情况下,我们可以根据 的值解析不同的对象connected

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

4

3 回答 3

1

您可以为 new 和 newTRUE 添加解析:

 .state('global.new', {
     url: '/new',
     templateUrl: '/htmls/editor.html',
     resolve: {
         isConnected: function() {
             return false;
         }
     },
     controller: 'EditorCtrl'
 })
 .state('global.newTRUE', {
     url: '/newTRUE',
     templateUrl: '/htmls/editor.html',
     resolve: {
         isConnected: function() {
             return true;
         }
     },
     controller: 'EditorCtrl'
 })

在 EditorCtrl(或 PanelsCtrl)中,您可以像这样使用它:

app.controller('EditorCtrl', ['$scope', '$state', 'isConnected', function($scope, $state, isConnected) {
    console.log("connected : " + isConnected); // you can save this value in Service and use it later.
    ...
}]);
于 2017-03-17T11:53:51.183 回答
1

您可以使用经典方法 - 解决

或者您可以使用 Angular ui 路由器中的隐藏参数。params : {isConnected' : null}在您的父global状态中定义。在:

  • global.newTRUE - 在 $state 配置中设置值
  • global.new - 在 $state 配置中设置值
  • global.editor.panels - 在transition/go或中设置参数ui-sref

定义是这样的:

$stateProvider
      .state('global.newTRUE', {
        url : '/:newTRUE',
        params : {
          'isConnected' : false
        }
   });
}

在控制器中,您从$stateParams. 这种方法的问题是隐藏参数在刷新页面中丢失,除非设置了默认值

于 2017-03-17T14:15:20.620 回答
0

您当然可以使用paramsUI-Router 状态的配置来不在 URL 中显示它并实现所有提到的点。

此外,根据#2,您connected需要falsefor/newtruefor /newTRUE。我们可以通过传递truefalse作为这些状态的默认值来做到这一点。像这样的东西:

$stateProvider
    .state('global.editor', {
        url: '/posts/editor/{id}',
        templateUrl: '/htmls/editor.html',
        params: { connected: null },
        controller: 'EditorCtrl',
        resolve: {
            post: ['$stateParams', 'codeService', function ($stateParams, codeService) {
                return codeService.getPost($stateParams.id)
            }]
        }
    }
    .state('global.new', {
        url: '/new',
        templateUrl: '/htmls/editor.html',
        params: { connected: false }, // default false for /new
        controller: 'EditorCtrl'
    })
    .state('global.newTRUE', {
        url: '/newTRUE',
        templateUrl: '/htmls/editor.html',
        params: { connected: true }, // default true for /newTRUE
        controller: 'EditorCtrl'
    })           
    .state('global.editor.panels', {
        controller: 'PanelsCtrl',
        params: { layout: 'horizontal', connected: null },
        templateUrl: function (params) { return "/htmls/" + params.layout + '.html' }
    }

对于#3,为了访问connected您的控制器(EditorCtrlPanelsCtrl),您可以注入$stateParams控制器并使用$stateParams.connected它来获取它。

对于#4,(这或多或少类似于实现#3

就像你得到的一样$stateParams.id,你也可以拥有$stateParams.connected,你可以用它来根据 的值来解析不同的对象connected。像这样的东西:

.state('global.editor', {
    url: '/posts/editor/{id}',
    templateUrl: '/htmls/editor.html',
    params: { connected: null },
    controller: 'EditorCtrl',
    resolve: {
        post: ['$stateParams', 'codeService', function ($stateParams, codeService) {
            return $stateParams.connected ? 
                codeService.getPost($stateParams.id) :
                codeService.getSomethingElse($stateParams.id) 
        }]
    }
}

但是,为了使它起作用,请确保您connected在访问global.editor状态时作为参数传递(使用$state.goor ui-sref

希望这可以帮助!

于 2017-03-18T05:39:15.863 回答