Параметр ui-router в контроллере и разрешить
Я настроил следующий 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/ в браузере приводит к (состояние global.editor
, то к) государству global.editor.panels
,
Теперь я хочу добавить параметр connected
:
- Я не хочу, чтобы это было показано в URL
- https://localhost:3000/ в браузере делает
connected
бытьfalse
и https://localhost:3000/ в браузере делаетconnected
бытьtrue
connected
можно пройти в контроллерEditorCtrl
а такжеPanelsCtrl
connected
могут быть доступны вresolve
изglobal.editor
; в идеале мы могли бы разрешить различные объекты в соответствии со значениемconnected
,
Кто-нибудь знает, как этого добиться?
3 ответа
Вы можете использовать params
UI-Router заявляет "config", чтобы он не отображался в 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
)
Надеюсь это поможет!
Вы можете использовать классический подход - в решимости
Или вы можете использовать скрытые параметры от углового интерфейса UI. определять params : {isConnected' : null}
в твоих родителях global
государство. В:
- 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
, Проблема этого подхода в том, что скрытые параметры теряются на странице обновления, кроме случаев, когда установлено значение по умолчанию.
Вы можете добавить решимость для новых и новых TRUE:
.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.
...
}]);