ui-router in controller 的一个参数并解析
A parameter of ui-router in controller and resolve
我配置了以下ui-路由器。
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
:
- 我不希望它显示在 url
- https://localhost:3000/#/new 在浏览器中使
connected
成为 false
,而 https://localhost:3000/#/newTRUE浏览器使 connected
成为 true
connected
可以传入控制器EditorCtrl
和PanelsCtrl
connected
可以在global.editor
的resolve
中获得;理想情况下,我们可以根据 connected
. 的值来解析不同的对象
有谁知道如何做到这一点?
您可以为 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.
...
}]);
您可以使用经典方法 - 在 resolve
或者您可以使用 angular ui 路由器的隐藏参数。
在您的父 global
状态中定义 params : {isConnected' : null}
。
在:
- global.newTRUE - 在 $state config
中设置值
- global.new - 在 $state config
中设置值
- global.editor.panels - 在
transition/go
或ui-sref
中设置参数
定义是这样的:
$stateProvider
.state('global.newTRUE', {
url : '/:newTRUE',
params : {
'isConnected' : false
}
});
}
在控制器中,您从 $stateParams
进入。
这种方法的问题是隐藏参数在刷新页面中丢失,除非设置了默认值
您当然可以使用 UI-路由器状态配置的 params
不在 URL 中显示它并实现所有提到的要点。
此外,根据 #2,对于 /new
,您需要 connected
为 false
,对于 /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,为了在您的控制器(EditorCtrl
和 PanelsCtrl
)中访问 connected
,您可以注入 $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)
}]
}
}
但是,要使其正常工作,请确保在访问 global.editor
状态(使用 $state.go
or ui-sref
)
时将 connected
作为参数传递
希望对您有所帮助!
我配置了以下ui-路由器。
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
:
- 我不希望它显示在 url
- https://localhost:3000/#/new 在浏览器中使
connected
成为false
,而 https://localhost:3000/#/newTRUE浏览器使connected
成为true
connected
可以传入控制器EditorCtrl
和PanelsCtrl
connected
可以在global.editor
的resolve
中获得;理想情况下,我们可以根据connected
. 的值来解析不同的对象
有谁知道如何做到这一点?
您可以为 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.
...
}]);
您可以使用经典方法 - 在 resolve
或者您可以使用 angular ui 路由器的隐藏参数。
在您的父 global
状态中定义 params : {isConnected' : null}
。
在:
- global.newTRUE - 在 $state config 中设置值
- global.new - 在 $state config 中设置值
- global.editor.panels - 在
transition/go
或ui-sref
中设置参数
定义是这样的:
$stateProvider
.state('global.newTRUE', {
url : '/:newTRUE',
params : {
'isConnected' : false
}
});
}
在控制器中,您从 $stateParams
进入。
这种方法的问题是隐藏参数在刷新页面中丢失,除非设置了默认值
您当然可以使用 UI-路由器状态配置的 params
不在 URL 中显示它并实现所有提到的要点。
此外,根据 #2,对于 /new
,您需要 connected
为 false
,对于 /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,为了在您的控制器(EditorCtrl
和 PanelsCtrl
)中访问 connected
,您可以注入 $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)
}]
}
}
但是,要使其正常工作,请确保在访问 global.editor
状态(使用 $state.go
or ui-sref
)
connected
作为参数传递
希望对您有所帮助!