Short story: I want to do some state change approval to make sure users
don't get into the wrong state, and I want to do that asynchronously,
similarly to a connect middleware model. Something like:
$rootScope.$on '$stateChangeStart', (event, toState, toParams)->
if toState.authorize?
toState.authorize(toParams).then (val)->
if val == false
event.preventDefault()
$state.go 'error'
else
event.next()
Which, of course doesn't work. It looks like the way the event goes, if I
don't call event.preventDefault() synchronously, I don't prevent the state
change. But I don't know if the state change is allowed until after the
promise permissions-check promise resolves.
Has anyone tried to get this working? I'm thinking about some complex and
annoying flags. Something like - always call preventDefault if there's an
authorize block and the state params don't have an authorizePrecheck ==
true. Then if the promise resolves good, set toParams.authorizePrecheck =
true and call $state.go toState, toParams
That seems a bit unwieldy, but would probably work (I'll check that in a
bit). Is there a strategy I hadn't thought of?
I know that I *could* change how my checkPermissions function works and
throw an error, then put the authorization code in the resolve block of
each state, then listen on $stateChangeError, and that's a possibility as
well. It's just that I have a ton of permissioned states and this seemed to
be a bit smarter - DRYer if nothing else.
Eric
PS: this is all convenience, by the way. the actual authorization code also
runs on the server, but this helps users who click constructed URLs or
bookmarks to pages know that they're in a place that they're 403 for.
Otherwise, they'd get weirdly-behaving pages in general, as the server
threw 403s on the XHR requests associated with saving the edited document
or whatever.
--
You received this message because you are subscribed to the Google Groups
"AngularJS" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/angular.
For more options, visit https://groups.google.com/d/optout.