我配置了以下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
:
connected
为false
,而浏览器中的https://localhost:3000/#/newTRUE会使connected
成为true
connected
可以进入控制器EditorCtrl
和PanelsCtrl
connected
可以在resolve
的{{1}}中找到;理想情况下,我们可以根据global.editor
。有谁知道如何做到这一点?
答案 0 :(得分: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.
...
}]);
答案 1 :(得分:1)
您可以使用经典方法 - 解决
或者您可以使用angular ui路由器中的隐藏参数。
在您的父params : {isConnected' : null}
州定义global
。
在:
transition/go
或ui-sref
定义是这样的:
$stateProvider
.state('global.newTRUE', {
url : '/:newTRUE',
params : {
'isConnected' : false
}
});
}
并在控制器中从$stateParams
进入。
这种方法的问题是隐藏参数在刷新页面中丢失,除非设置了默认值
答案 2 :(得分:0)
您肯定可以使用params
UI-Router状态'配置,不在URL中显示它并实现所有提到的要点。
另外,根据#2 ,connected
需要false
/new
true
/newTRUE
。我们可以通过将true
或false
作为这些状态的默认值来实现。像这样:
$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
(EditorCtrl
和PanelsCtrl
),您可以向控制器注入$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.go
或ui-sref
)
希望这有帮助!