1.0.0
版本发布时间: 2017-06-11 05:51:07
angular-ui/ui-router最新发布版本:1.1.1(2024-07-15 19:46:04)
1.0.0-rc.1...1.0.0 (2017-04-30)
NOTICE: The npm package is renamed from angular-ui-router
to @uirouter/angularjs
Bug Fixes
- noImplicitAny: move noimplicitany compliance test file to correct location (ec6e5e4)
- onEnter: Fix typescript typing for onEnter/onRetain/onExit (df6ee24)
- routeToComponent: Bind resolves that start with data- or x- (4559c32)
- StateRegistry: Allow stateRegistry.register() to take a Ng1StateDeclaration (cc88525), closes #3345
- uiCanExit: Only process uiCanExit hook once during redirects (7a086ee)
- uiSref: replace angular.copy with extend (PR #3330) (20d1fcd), closes #3189
-
UrlRouterProvider: export
UrlRouterProvider
symbol for use with .d.ts typings (d71bad0), closes #3296 - view: Allow targeting nested named ui-view by simple ui-view name (8fe5b1f)
- views: Allow same views object to be reused in multiple states (66103fc), closes #3353
- views: Better validation of view declarations (throw when there are state-level and view-level conflicts) (7573156)
Features
- uiSref: Bind ui-sref to other DOM events (PR #3343) (193ac2e), closes #3169
-
uiSref: switch custom events prop from
event:
toevents:
(d3942a6)
UI-Router for AngularJS version 1.0.0 updates ui-router-core@3.1.0
to @uirouter/core@5.0.1
.
Please keep reading to see if the breaking changes from core between 3.1.0 and 5.0.1 affect you.
@uirouter/core
changes 3.1.0...5.0.0 (2017-04-30)
Bug Fixes
- BrowserLocationConfig: fixed protocol + port value (#38) (5559382)
-
lazyLoad: Allow
lazyLoad
stateBuilder: Get lazyLoad fn from internal State object, not StateDeclaration (9313880) - lazyLoad: Wait for future state to be replaced before registering lazy children (4bdce47)
- noImplicitAny: Fix noimplicitany compliance (1a6cdfc)
- pushStateLocation: call listeners in url() (#24) (7c90911), closes #23
- redirect: Do not update URL after redirect with { location: false } (652a760)
-
resolve: Allow resolve's state context to be injected as
$state$
(a06948b) - tfs: Rename $q.ts and $injector.ts files, removing leading dollar signs (cb653ee)
- trace: Re-add transitionStart trace (b019036)
- transitionHook: Do not process transition hooks after router has been disposed. (666c6d7)
- TransitionHook: Transition hooks no longer expose the internal StateObject (2b0e48b)
- typings: Allow strictNullChecks for HookMatchCriteria (d92d4d5)
- ui-sref: Improve performance of generating hrefs (c3967bd)
- view: Do not throw when uiView doesn't have a state context (f76ee2a)
- view: Update views in order of ui-view depth and also by state depth (46dea2b)
Features
- abort: Add API to manually abort/cancel a transition (39f8a53)
- common: Perf improvements in hot functions: (4193244)
-
core: Export all vanilla.* code from
ui-router-core
(f3392d1) - core: Switch to @uirouter/core npm module (e3f389f)
- decorators: Add state, resolve and resolve data decorators (642df0b)
- defaultErrorHandler: Do not invoke default error handler for ABORTED transitions (b07a24b)
-
globals: Removed
UIRouterGlobals
interface. RenamedGlobals
class toUIRouterGlobals
(8719334) - Globals: implement Disposable and delete global transition data (a794018)
- onBefore: Run onBefore hooks asynchronously. (30b82aa)
- onEnter/Exit/Retain: Use onExit/onEnter/onRetain from 56955state(), not state.self (bc1f554)
- Rejection: Add $id to ease debugging of transition rejections (d456d54)
- State: Support registration of ES6 state classes (as opposed to object literals) (3a5d055)
- State: Switch Internal State Object to prototypally inherit from the State Declaration (027c995), closes #34
-
StateObject: Rename internal
State
object toStateObject
(feceaf9) -
StateRegistry: improve perf for:
.register()
andStateMatcher.find()
misses (fdb3ab9) - transition: Ignore duplicate transitions (double clicks) (bd1bd0b)
- transition: Improve supersede logic: Do not supersede if the new trans is aborted before onStart (3141a8f)
- transition: Run hooks synchronously in current stack, when possible (953e618)
-
Transition: deprecate
Transition.is()
which was never implemented (1edff4b) - Transition: Normalize all transition errors to a Rejection. (a7464bb)
-
UIRouter: Add
trace
global to theUIRouter
object (48c5af6) -
UrlService: (
UrlRouter
) improve perf of registering Url Rules and sorting Url Rules (64fbfff) -
UrlService: Add
rules.initial("/home")
to config initial state (like otherwise) (bbe4209) -
View: Allow targeting views on own state using
viewname@.
(normalizeUIViewTarget) (7078216), closes #25
BREAKING CHANGES
TransitionHook: Transition hooks no longer expose the internal State
object (now named StateObject
)
Before:
import { State } from "ui-router-core";
const match = { to: (state: State) => state.data.auth };
transitionsvc.onEnter(match, (trans: Transition, state: State) => {
// state is the internal State object
if (state.includes["foo"]) { // internal ui-router API
return false;
}
}
Now:
import { StateDeclaration } from "ui-router-core";
const match = { to: (state: StateDeclaration) => state.data.auth };
transitionsvc.onEnter(match, (trans: Transition, state: StateDeclaration) => {
// state === the state object you registered
// Access internal ui-router API using $$state()
if (state.$$state().includes["foo"]) {
return false;
}
}
Motivation:
The State
object (now named StateObject
) is an internal API and should not be exposed via any public APIs.
If you depend on the internal APIs, you can still access the internal object by calling state.$$state()
.
BC Likelihood
How likely is this BC to affect me?
Medium: You will likely be affected you 1) have transition hooks, 2) are using typescript and/or 3) use the internal ui-router State API.
BC Severity
How severe is this BC?
Low: Access to the internal api is still available using $$state()
.
StateObject: Renamed internal API State
object to StateObject
Before:
import {State} from "ui-router-core";
-
Now:
import {StateObject} from "ui-router-core";
Motivation:
We'd like to use the State
name/symbol as a public API.
It will likely be an ES7/TS decorator for ES6/TS state definition classes, i.e:
@State("foo")
export class FooState implements StateDeclaration {
url = "/foo";
component = FooComponent;
@Resolve({ deps: [FooService] })
fooData(fooService) {
return fooService.getFoos();
}
}
BC Likelihood
How likely is this to affect me?
Low: This only affects code that imports the internal API symbol State
.
You will likely be affected you 1) import that symbol, 2) are using typescript and 3) explicitly
typed a variable such as let internalStateObject = state.$$state();
BC Severity
How severe is this change?
Low: Find all places where State
is imported and rename to StateObject
Transition: All Transition errors are now wrapped in a Rejection object.
Before:
Previously, if a transition hook returned a rejected promise:
.onStart({}, () => Promise.reject('reject transition'));
In onError
or transtion.promise.catch()
, the raw rejection was returned:
.onError({}, (trans, err) => err === 'reject transition')
Now:
Now, the error is wrapped in a Rejection object.
- The detail (thrown error or rejected value) is still available as
.detail
.
.onError({}, (trans, err) =>
err instanceof Rejection && err.detail === 'reject transition')
- The Rejection object indicates the
.type
of transition rejection (ABORTED, ERROR, SUPERSEDED and/or redirection).
.onError({}, (trans, err) => {
err.type === RejectType.ABORTED === 3
});
Motivation:
Errors thrown from a hook and rejection values returned from a hook can now be processed in the same way.
BC Likelihood
How likely is this to affect me?
Medium: apps which have onError handlers for rejected values
BC Severity
How severe is this change?
Low: Find all error handlers (or .catch/.then chains) that do not understand Rejection. Add err.detail
processing.
onBefore: onBefore
hooks are now run asynchronously like all the other hooks.
Old behavior
Previously, the onBefore
hooks were run in the same stackframe as transitionTo
.
If they threw an error, it could be caught using try/catch.
transitionService.onBefore({ to: 'foo' }), () => { throw new Error('doh'); });
try {
stateService.go('foo');
} catch (error) {
// handle error
}
New behavior
Now, onBefore
hooks are processed asynchronously.
To handle errors, use any of the async error handling paradigms:
- Chain off the promise
transitionService.onBefore({ to: 'foo' }), () => { throw new Error('doh'); }); stateService.go('foo').catch(error => { //handle error });
- Define an error handler
transitionService.onBefore({ to: 'foo' }), () => { throw new Error('doh'); }); transitionService.onError({ to: 'foo' }), () => { // handle error }); stateService.go('foo');
- Use the global defaultErrorHandler
transitionService.onBefore({ to: 'foo' }), () => { throw new Error('doh'); }); stateService.go('foo'); stateService.defaultErrorHandler(error => { // global error handler });
Motivation
Why introduce a BC?
- No subtle behavior differences by hook type
- Simpler code and mental model
- Fewer edge cases to account for
BC Liklihood
How likely is this to affect my app?
Very Low: Apps that registered onBefore hooks and depend on synchronous execution are affected.
BC Severity
How severe is this BC?
Low: Switch to asynchronous handling, such as chaining off the transition promise
defaultErrorHandler: ABORTED transitions do not invoke the defaultErrorHandler
Returning false
from a transition hook will abort the transition.
Old behavior
Previously, this case was considered an error and was logged by
defaultErrorHandler
.
After your feedback, we agree that this is not typically an error.
New behavior
Now, aborted transitions do not trigger the defaultErrorHandler
Motivation:
Why introduce a BC?
Most users do not consider ABORT to be an error. The default error handler should match this assumption.
BC liklihood
How likely am I to be affected?
Low: Most users do not consider ABORT to be an error. For most users this will not be a BC.
BC severity
How severe is this BC?
Low: Users who want to handle all transition rejections can
register a .onError
handler and filter/process accordingly.
globals: This change will likely only affect a small subset of typescript users and probably only those using ui-router-ng2
.
If you're injecting the Globals
class somewhere, e.g.:
@Injectable()
class MyService {
_globals: UIRouterGlobals;
constructor(globals: Globals) {
this._globals = <UIRouterGlobals> globals;
}
}
you should now inject UIRouterGlobals
, e.g.:
@Injectable()
class MyService {
constructor(public globals: UIRouterGlobals) { }
}
Likewise, if you were casting the UIRouter.globals
object as a UIRouterGlobals
, it is no longer necessary:
function myHook(trans: Transition) {
let globals: UIRouterGlobals = trans.router.globals; // cast is no longer necessary
}