angular

UI-Router for Angular: State-based routing for Angular (v2+)

MIT License

Downloads
86.7K
Stars
353
Committers
205

Bot releases are hidden (Show)

angular - 2.0.0

Published by christopherthielen over 6 years ago

2.0.0 (2018-05-09)

Compare @uirouter/angular versions 1.1.0 and 2.0.0

Features

  • angular: Drop Angular v4 support, add Angular v6 support (cdf0273), closes #301
  • core: Update core to 5.0.19, rx to 0.5.0 (be6de0d)

BREAKING CHANGES

  • angular: RxJS v6 and Angular v5 or higher is now required to use this package.

If using Angular v5, you should update to "rxjs": "^6.0.0" and also add "rxjs-compat": "^6.0.0".

Updated @uirouter/core from 5.0.18 to 5.0.19

Compare @uirouter/core versions 5.0.18 and 5.0.19

Bug Fixes

angular - 1.1.0

Published by christopherthielen over 6 years ago

1.1.0 (2018-05-03)

Compare @uirouter/angular versions 1.0.1 and 1.1.0

Bug Fixes

  • uiSref: Ignore clicks if destination state is falsey (b599e72)
  • uiView: Always inject and/or bind NOWAIT resolve as a Promise object. (42d739d)

Features

  • uiView: Add uiOnParamsChanged support for routed components (45aa2aa)

Updated @uirouter/core from 5.0.17 to 5.0.18

Compare @uirouter/core versions 5.0.17 and 5.0.18

Bug Fixes

  • angular: A hack to force the Angular compiler to import from module index (d56a2be)
  • StateRegistry: Notify listeners of added states when there are orphans in the state queue (5a9bac9)
  • transition: Fix typing of Transition.params() (ebea30e)
  • transition: Normalize error() to always return Rejection (9bcc5db)
angular - 1.0.1

Published by christopherthielen over 6 years ago

1.0.1 (2018-02-12)

Compare @uirouter/angular versions 1.0.0 and 1.0.1

Bug Fixes

  • package: update @uirouter/core to version 5.0.17 (f018f35)
  • uiSrefActive: Support multiple active classes (e086700)

Updated @uirouter/core from 5.0.16 to 5.0.17

Compare @uirouter/core versions 5.0.16 and 5.0.17

Bug Fixes

  • core: Fix leak of old transitions by mutating pathnode*.resolvables*.data (0a1f518)
angular - 1.0.0

Published by christopherthielen over 6 years ago

1.0.0 (2018-01-31)

Compare @uirouter/angular versions 1.0.0-rc.3 and 1.0.0

Updated @uirouter/core from 5.0.14 to 5.0.16

Compare @uirouter/core versions 5.0.14 and 5.0.16

Bug Fixes

  • common: Fix signature of for objects (make target optional) (61d0afc)
  • core: Fix memory leak of resolve data from ALL transitions ever (7f2aed1)
  • pathNode: add backwards compat for PathNode.clone(). Add retainedWithToParams to treeChanges interface. (4833a32)

Features

  • common: Add map-in-place support to map() (12bc7d8)
  • common: Add onEvict() callback registry for queues with max length (c19d007)
angular -

Published by christopherthielen almost 7 years ago

1.0.0-rc.3 (2018-01-10)

Compare @uirouter/angular versions 1.0.0-rc.2 and 1.0.0-rc.3

Bug Fixes

  • hooks: Use an APP_INITIALIZER to sync/listen to the URL (f1d390f)

Updated @uirouter/core from 5.0.13 to 5.0.14

Compare @uirouter/core versions 5.0.13 and 5.0.14

Bug Fixes

  • trace: Fix null reference in uiview name sort function (59cb067)
  • treeChanges: apply toParams to 'retained' path (#72) (cf63d11)
angular -

Published by christopherthielen almost 7 years ago

1.0.0-rc.2 (2017-12-22)

Compare @uirouter/angular versions 1.0.0-rc.1 and 1.0.0-rc.2

Bug Fixes

  • package: Bump dependency on uirouter/publish-scripts to fix npm install (1a026d2)
  • package: update @uirouter/core to version 5.0.13 (90aa1d4)

Features

  • uiSref: Add support for ctrl/middle-clicking on a uiSref generated URL (#175) (973924a)

Updated @uirouter/core from 5.0.11 to 5.0.13

Compare @uirouter/core versions 5.0.11 and 5.0.13

Bug Fixes

  • browserLocation: Use location.pathname (not href) or '/' when no base tag found (db461d6)
  • browserLocationConfig: If no base href found, use location.href (not empty string) (0251424)
  • pushStateLocation: Fix URLs: add slash between base and path when necessary (bfa5755)
  • pushStateLocation: When url is "" or "/", use baseHref for pushState (042a950)
  • resolve: Add onFinish hook to resolve any dynamicly added resolvables (7d1ca54)
  • urlRouter: Update query params when resetting url via .update() (7664cd0)

Features

  • view: Add onSync callback API to plugin API (9544ae5)
angular -

Published by christopherthielen almost 7 years ago

1.0.0-rc.1 (2017-12-06)

Compare @uirouter/angular versions 1.0.0-rc.0 and 1.0.0-rc.1

Bug Fixes

  • package: Rebuild uirouter/angular using angular 4.4.6 (a39aed8)
  • package.json: npm shrinkwarp with angular 5 (477d0f7)
angular -

Published by christopherthielen almost 7 years ago

1.0.0-rc.0 (2017-11-15)
Compare @uirouter/angular versions 1.0.0-beta.9 and 1.0.0-rc.0

Bug Fixes

  • uiView: Fix animations :enter trigger by using markForCheck (3d7ce44)

Features

  • directives: Export directives using exportAs: for use as template variables (3d532b6)
  • lazyLoad: Allow loadChildren for non-future states. (ac3cdef)
  • uiView: add getter for state which is filling the uiview (e7cb5f1)
angular -

Published by christopherthielen about 7 years ago

1.0.0-beta.9 (2017-10-17)

Compare @uirouter/angular versions 1.0.0-beta.8 and 1.0.0-beta.9

Features

  • UIRouterModule: Add initial property to forRoot to specify the initial route. (b7b5e4f)

Updated @uirouter/core from 5.0.10 to 5.0.11

Compare @uirouter/core versions 5.0.10 and 5.0.11

Bug Fixes

  • ie9: make console.bind work in ie9 (#85) (318214b)
angular -

Published by christopherthielen about 7 years ago

1.0.0-beta.8 (2017-10-07)

Compare @uirouter/angular versions 1.0.0-beta.7 and 1.0.0-beta.8

Bug Fixes

  • NgModule: Use InjectionToken instead of OpaqueToken (bfa604c)
  • typescript: Fix typescript 2.4 compatibility issue (d0c46ce)
  • uiSref: run update when input properties change (#141) (9ecc6e2)

Features

  • UIRouterModule: Add deferInitialRender toggle to forRoot. Waits for initial router transition before bootstrapping the app the initial render. (5ae9051)
  • uiSrefStatus: Emit all enclosed uiSref targetStates in the status object (0687e19)
  • uiSrefStatus: emit state/params in events (bd67d25)

@uirouter/core updated from 5.0.4 to 5.0.10 (2017-10-07)

Compare @uirouter/core versions 5.0.4 and 5.0.10

Bug Fixes

  • angular/cli: Use package.json fields: 'typings', 'main', 'jsnext:main' (74143d9)
  • bundle: Rollup: Do not warn on THIS_IS_UNDEFINED (a4581b1)
  • globals: Use shallow copy to update the globals.params / $state.params object (e883afc)
  • Injector: When getting tokens from native injector, only throw on undefined (not on falsey values) (ada9ca2)
  • isomorphic: Remove use of CustomEvent. Detect root scope (global/window/self) for nodejs, browser, or web-worker. (2d206ba)
  • redirectTo: Fix typings for redirectTo. Allow a function that returns a target state or a promise for one. (3904487)
  • sourceMaps: Embed typescript sources in sourcemaps (10558a3)
  • trace: Fall back to console.log if .table is unavailable (IE) (c8110fc)
  • trace: Support tracing of object-parameters with circular references (2f1ae9a)
  • typescript: Fix strictNullCheck type error (0ae585e)
  • typescript: Update to typescript 2.4 (ce1669b)
  • typings: Use StateObject for parameter to hook criteria functions (5b58566)
  • url: Add CustomEvent polyfill for IE (a50db21)
  • urlRouter: Fix absolute 'href' generation by using location.hostname (not location.host) (a28b68a)
  • urlService: Fix priority sorting of URL rules (73a1fe0)
  • vanilla: fix base path handling for vanilla push state (ad61d74)
  • vanilla: Use self instead of window for webworker compat (a4629ee)

Features

  • Resolvable: Add .value(): returns value (WAIT) or promise (NOWAIT) (8769449)
  • TargetState: Add builder methods .withState, .withParams, and .withOptions (6b93142)
  • TransitionHook: Add hook registration option invokeLimit to limit the number of times a hook is invoked before being auto-deregistered. (2cb17ef)
  • urlMatcher: add support for multiline urls (5b11ce0)
angular -

Published by christopherthielen over 7 years ago

1.0.0-beta.6 (2017-04-28)

Adds supports for Angular 4.x, removes support for Angular 2.x

Bug Fixes

  • uiSref: open new tab when a tag has target="_blank" (d13ed47)

Features

  • resolve: auto-map resolve values to matching component inputs in AoT (f6c552d)
angular -

Published by christopherthielen over 7 years ago

1.0.0-beta.7 (2017-06-19)

Bug Fixes

  • lazyLoad: fixed getting parent injector in angular 4.2 (dcd1cda)
  • Ng2LocationServices: Do not fireAfterUpdate when on server. (543afcd)
  • UISrefStatus: Fix memory leak -- take only one inner subscription at a time. (#120) (5a65d3c), closes #21

Features

  • view: Support shorthand for named views, views: { viewName: Component } (84aec02)

Changes in @uirouter/core from 5.0.0 to 5.0.4

Bug Fixes

  • common: Fix implementation of 'pick' -- use hasOwnProperty (09848a4)
  • common: Re-fix implementation of 'pick' using for .. in (f2da7f4)
  • future: Allow future states to specify a parent: (828fe1b)
  • transition: Do not ignore transitions which have states being entered or exited (175717e)
  • view: only sync views which are of the same name and type (c48da4a)

Features

  • build: Build and distribute UMD bundles (0a8da85)
  • invalidTransition: Better error messaging when param values are invalid (2a15d1a)
  • Resolvable: Add .value(): returns value (WAIT) or promise (NOWAIT) (8769449)
  • trace: Trace view synchronization. Allow trace.enable(...string) (284392d)
  • urlMatcher: add support for multiline urls (5b11ce0)
angular - UIRouter for Angular 2.x 1.0.0-beta.5

Published by christopherthielen over 7 years ago

1.0.0-beta.5 (2017-04-22)

NOTICE: The npm package name change

The npm package changed to @uirouter/angular. See UIRouter scoped packages for details

Bug Fixes

  • bindings: Make bindings: work on a state declaration (as well as a view declaration) (a21c479)
  • bundle: Only bundle ui-router-ng2 code (do not bundle ui-router-core) (a285218)
  • bundle: work around rollup bug https://github.com/rollup/rollup/issues/1322 (89884b9)
  • lazyLoad: Supply native injector to lazy loaded states (ebce639)
  • Ng2LocationServices: Ignore duplicated 'hashchange' event in favor of 'popstate' event (82a3e2e)
  • NgModule: De-dupe states loaded from NgModule (ffe85cb)
  • package.json: Fix engines in package.json (b2d828a)
  • rxjs: Fix missing RxJS operators in tree-shaked apps (5f03719)
  • rxjs: import rxjs operators. (26a74ef)
  • uiSref: avoid empty links (#26) (5f6870d)

Features

  • bindings: Apply explicit bindings even when no [@Input](https://github.com/Input)() found. (4351c53)
  • config: Pass the module object to the module config function (e9705b0)
  • Ng2LocationConfig: use BrowserLocationConfig. (7e0aef6)
  • uiCanExit: Add uiCanExit hook for routed components (633573e)

Reverts

BREAKING CHANGES

bundle: We no longer bundle the core nor rx code in the UMD bundle.

Previously, the ui-router-ng2 bundle included the code from ui-router-core and ui-router-rx.
Now, each UMD bundle must be included separately.

This change is most likely to affect:

  • SystemJS projects
  • projects that do not bundle (but ship pre-built UMD bundles)
  • Users of ui-router plugins that import ui-router-core, such as sticky-states.

This release of @uirouter/angular updates @uirouter/core from 4.0.0 to 5.0.0.
Here are the changes from core:

@ui-router/core changes

5.0.0 (2017-04-22)

Bug Fixes

  • BrowserLocationConfig: fixed protocol + port value (#38) (5559382)
  • lazyLoad: Wait for future state to be replaced before registering lazy children (4bdce47)
  • noImplicitAny: Fix noimplicitany compliance (1a6cdfc)
  • redirect: Do not update URL after redirect with { location: false } (652a760)
  • 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: Switch to @uirouter/core npm module (e3f389f)
  • defaultErrorHandler: Do not invoke default error handler for ABORTED transitions (b07a24b)
  • Globals: implement Disposable and delete global transition data (a794018)
  • onBefore: Run onBefore hooks asynchronously. (30b82aa)
  • onEnter/Exit/Retain: Use onExit/onEnter/onRetain from StateObject, not state.self (bc1f554)
  • Rejection: Add $id to ease debugging of transition rejections (d456d54)
  • State: Switch Internal State Object to prototypally inherit from the State Declaration (027c995), closes #34
  • StateObject: Rename internal State object to StateObject (feceaf9)
  • StateRegistry: improve perf for: .register() and StateMatcher.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: Normalize all transition errors to a Rejection. (a7464bb)
  • 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)

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.
Some day (not today) 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.

angular - 1.0.0-beta.4: AoT + Angular-CLI support

Published by christopherthielen over 7 years ago

1.0.0-beta.4 (2017-01-22)

This is a major release of ui-router-ng2 with many new features, including support for the angular-cli.
We now support AoT compilation with NgModule lazy loading (via Future States).
We also enabled code splitting support from the @ngtools/webpack project.

There are numerous BREAKING CHANGES including those from the ui-router-core dependency.
Please read through them carefully.

AoT support + lazy loading + Angular-CLI

Commits eb5d599, 2a4b174, and 8088ef9 enable AoT compilation support and better Lazy Loading support.
When @ngtools/webpack is being used, this also enables automatic code splitting + lazy loading. 
Because angular-cli uses @ngtools/webpack, this change also enables angular-cli support.

To use these new features, define a Future State (by appending .** to
the state name).  Give the state a loadChildren property which points
to a nested NgModule that will be lazy loaded.  Use the same syntax that
@ngtools/webpack expects: <pathToModule>#<name of export>.

export var futureFooState = {
  name: 'foo.**',
  url: '/foo',
  loadChildren: './foo/foo.module#FooModule'
};

...

  imports: [
    UIRouterModule.forRoot({ states: [ futureFooState  ] }),
...

In your nested module, add a state named foo (without the .**). This
nested module's foo state will replace the foo.** Future State (placeholder).

export var fooState = {
  name: 'foo',
  url: '/foo',
  resolve: {
    fooData: fooResolveFn
  },
  onEnter: onEnterFooFn,
  data: {
    requiresAuth: true
  }
};

...

  imports: [
    UIRouterModule.forChild({ states: [ fooState ] }),
...

This change works by providing the same DI token as the @angular/router
which is then analyzed for lazy loading by @ngtools/webpack.
The ROUTES token is deep imported from @angular/router/src/router_config_loader.
The module's states are provided on the ROUTES token, which enables the
webpack tooling to analyze the states, looking for loadChildren.

When the UMD bundle is built, the ROUTES token is pulled in from
@angular/router (and duplicated), but should not be used by anything.

Because we pull in the token from the @angular/router package, we have
a temporary dependency on the angular router.  This is a temporary hack
until the @ngtools/webpack project makes itself router-agnostic.

Bug Fixes

  • #3087: deep rxjs imports (964c99f)
  • build: bump ng2 deps and remove prepublish step (c6628fa)
  • lazyLoad: Update lazyLoad for ui-router-core 3.1 (2a4b174)
  • loadNgModule: Better error message when lazy loaded NgModule contains no state defs (7d4ac6d)
  • location: Do not deep import vanilla.* from ui-router-core (19113ee)
  • location: make initial otherwise('/') activate state (perform url sync) (33ae6a8)
  • uiSrefActive: Allow ng-if on nested uiSrefs (e3051f5), closes #3046
  • params: Fix typed parameters by auto-flushing the param type queue (6241bca), closes #14
  • ui-router-rx: Fix ui-router-rx plugin name (a1855ab)

Features

  • BC: We no longer ship commonjs in the npm package. We now ship esm+es5 (individual files) and UMD bundles only. (34ea6ad)
  • BC: You no longer configure a module using an Injectable UIRouterConfig class. Now you use a function that receives the UIRouter and the Injector (9aae71a)
  • UIRouterConfig: Use a simple function to configure module instead of an injectable class (9aae71a)
  • AoT: Enable AoT with Lazy Loading. Enable Angular CLI support. (eb5d599)
  • build: Generate bundle using rollup instead of webpack (42b0f16)
  • bundles: Point package.json main: to the umd bundle. Stop shipping commonjs. (34ea6ad)
  • lazyLoad: Allow loadChildren: sugar on a state definition (2a4b174)
  • lazyLoad: automatically unwrap default export (__esModule) (allows easier default export of NgModule) (2a4b174)
  • lazyLoad: Support passing callback to lazyLoad for loading ng2 module (#3037) (a0688ae)
  • UrlService: Add UrlService injectable (33ae6a8), closes #17
  • rx: Move reactive extension to its own project at http://github.com/ui-router/rx (b0a672f)

BREAKING CHANGES

BREAKING CHANGE: We no longer ship commonjs in the npm package. We now ship esm+es5 (individual files) and UMD bundles only.

This brings ui-router-ng2 npm package in line with how the core Angular 2 packages are packaged.

We compile and distribute esm+es5 + typescript typings in lib/ (formerly in lib-esm/)
We no longer include the commonjs+es5 (formerly in lib/)
We now point the main: entry to the UMD bundle for commonjs users.

BREAKING CHANGE: You no longer configure a module using an Injectable UIRouterConfig class. Now you use a function that receives the UIRouter and the Injector

In 1.0.0-beta.3 you might have a config class like this:

export class MyUIRouterConfig {
  constructor(@Inject(UIRouter) router: UIRouter, @Inject(SomeService) myService: SomeService) {
    // do something with router and injected service
  }
}

which was wired into the root module like this:
```js
@NgModule({
  imports: [
    UIRouterModule.forRoot({ configClass: MyUIRouterConfig })
  ]
})
export class AppModule {}

In 1.0.0-beta.4 you should switch to a simple function.
The function receives the router: UIRouter and injector: Injector

export function configureModule(router: UIRouter, injector: Injector) {
  // do something with router
  router.urlService.rules.type('slug', slugParamType);
  // inject other services
  const myService: SomeService = injector.get(SomeService);
  // do something injected service
  myService.init();
}

which is now wired using config: configureModule instead of configClass: ...

@NgModule({
  imports: [
    UIRouterModule.forRoot({ configClass: MyUIRouterConfig })
  ]
})
export class AppModule {}

ui-router-core changes

This 1.0.0-beta.4 release of ui-router-ng2 updates ui-router-core from 1.0.0-beta.3 to 4.0.0

4.0.0 (2017-01-22)

Bug Fixes

  • lazyLoad: Allow lazyLoad stateBuilder: Get lazyLoad fn from internal State object, not StateDeclaration (9313880)
  • lazyLoad: Fix State.lazyLoad type def (9313880)
  • lazyLoad: Sync by URL after nested lazy load triggered by URL (1c6220c)
  • lazyLoad: Use UrlService.match() to retry url sync after successful lazy load triggered by url (8c2461d), closes #19
  • onBefore: Skip remaining hooks after the (#2) (8a45d04)
  • param: params: { foo: { raw: true } } overrides ParamType.raw (aefeabf)
  • Param: Mark all query parameters as optional (7334d98)
  • params: Check for null in int param type is() check (aa551e4), closes #3197
  • pushStateLocation: call listeners in url() (#24) (7c90911), closes #23
  • redirect: Do not allow onBefore hooks to cause infinite redirect loops (5c5f7eb), closes #6
  • redirectTo: Do not puke when redirectTo returns undefined (bde9c0f)
  • redirectTo: fix TS type signature of redirectTo (2c059c4)
  • resolve: Allow resolve's state context to be injected as $state$ (a06948b)
  • StateQueueManager: Compare parsed url parameters using typed parameters (beca1f5)
  • StateRegistry: Fix error message: State '' is already defined (f5bd96b)
  • StateService: Compare typed parameters in .is() and .includes() (b1a5155)
  • TargetState: Narrow name() return type to String (a02f4a7)
  • Transition: Use { location: replace } when redirecting a transtition in response to a URL sync (23e2b78)
  • typescript: Emit TS 1.8 compatible .d.ts files (65badf4)
  • typings: Allow urlRouter.rule to return void (0b78bdf)
  • UrlRouter: Use { location: 'replace' } whenever a url redirect happens (6cf9b8f)
  • UrlService: Wire urlMatcherFactory and urlRouter functions (a7b58d6)
  • vanilla: vanilla locations: do not parse "empty string" query key parameter (f949480)
  • view: Load view prerequisites in onFinish (cc85e76)
  • view.load: Allow view.load to return synchronously (8619cf9)

Features

  • BC: (CoreServices) Move location and locationConfig from services to UIRouter.locationService and UIRouter.locationConfig. (029fb00)
  • BC: Built-in string parameter type no longer encodes slashes as ~2F nor tildes as ~~ (72bb2d8)
  • BC: Path/Query parameters no longer default to string param type (72bb2d8)
  • BC: Hook errors are all normalized to a "Rejection" type. To access the detail of the error thrown (throw "Error 123"), use .detail, i.e.: (f486ced)
  • BC: Move html5Mode and hashPrefix from LocationServices to LocationConfig interface (9d316a7)
  • BC: move ViewService.viewConfigFactory and rootContext to _pluginapi.* (65badf4)
  • BC: Move html5Mode and hashPrefix to LocationServices from LocationConfig (f7ac2bb)
  • BC: Order URL Matching Rules by priority, not registration order (eb2f5d7)
  • BC: Previously, a state with a lazyLoad function was considered a future state. (ec50da4)
  • BC: Remove getResolveValue and getResolvable methods from Transition in favor of injector().get() and injector().getAsync() (111d259)
  • BC: Replace LocationServices.setUrl with LocationServices.url (4c39dcb)
  • BC: Replace UrlRouterProvider/UrlRouter with just UrlRouter (fddd1e2)
  • Create router.dispose() to dispose a router instance and resources. (0690917)
  • assertMap: Add a [].map() helper that asserts that each element is truthy (f044f53)
  • core: Export all vanilla.* code from ui-router-core (f3392d1)
  • futureState: States with a .** name suffix (i.e., foo.**) are considered future states (ec50da4)
  • globals: Removed UIRouterGlobals interface. Renamed Globals class to UIRouterGlobals (8719334)
  • hash: Change the hash parameter type ('#') to inherit: false so it is cleared out when another transition occurs. (849f84f), closes #3245 #3218 #3017
  • HookBuilder: Allow custom hook types (to be defined by a plugin) (3f146e6)
  • lazyLoad: Created StateService.lazyLoad method to imperatively lazy load a state (ec50da4), closes #8
  • lazyLoad: Exported/exposed the lazyLoadState function (ec50da4)
  • lazyLoad: the lazyLoad hook can be used to lazy load anything (component code, etc) (ec50da4), closes #4
  • LocationServices: Add a parts() method which returns the URL parts as an object (32e64f0)
  • onCreate: Add onCreate transition hook (f486ced)
  • Params: Add path and query param types (72bb2d8)
  • Params: add option to use generic type for Transition.params (#17) (eb12ec8), closes #16
  • Params: Allow inherit: false specified per parameter or type (849f84f)
  • Plugin: Allow all plugins to be gotted. (e324973)
  • Plugin: Allow registration by ES6 class, JS constructor fn, JS factory fn (b9f4541)
  • Plugin: Create plugin API (36a5215), closes #7
  • Resolve: implement NOWAIT policy: Do not wait for resolves before completing a transition. (05d4c73), closes #3243 #2691
  • State: add .parameters() option for filtering to matching keys (beca1f5)
  • Transition: Allow plugins to define own transition events like onEnter (0dc2c19)
  • Transition: Add Transition.originalTransition() to return the initial transition in a chain of redirects (4fe39e3)
  • Transition: Allow injector() to retrieve resolves for the exiting states/path (df502e8)
  • Transition: Allow a plain object ResolvableLiteral in Transition.addResolvable (ad9ae81)
  • Transition: Make Transition.params() immutable to avoid confusion about mutability (0162212)
  • Transition: Support treechange paths in API for Resolve+transition (beedc82)
  • UIRouter: Add trace global to the UIRouter object (48c5af6)
  • UrlMatcher: Add comparison function by UrlMatcher specificity (eb2f5d7)
  • UrlRouter: sort url rules by specificity, not by registration order. (eb2f5d7)
  • UrlService: allow eager or lazy binding of location objects during construction (7e0a8af)
  • UrlServices: Add match(): given a URL, return the best matching Url Rule (32e64f0)
  • vanilla: Implement in-memory-only location api (f64aace)
  • View: Allow targeting views on own state using viewname@. (normalizeUIViewTarget) (7078216), closes #25

BREAKING CHANGES

BREAKING CHANGE: Renamed Globals class to UIRouterGlobals (removed UIRouterGlobals interface)

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
}

Closes https://github.com/ui-router/core/issues/31

BREAKING CHANGE: Hook errors are all normalized to a "Rejection" type. To access the detail of the error thrown (throw "Error 123"), use .detail, i.e.:

Before

$state.go('foo').catch(err => { if (err === "Error 123") .. });

New way

$state.go('foo').catch(err => { if (err.detail === "Error 123") .. });

BREAKING CHANGE: Order URL Matching Rules by priority, not registration order

URL Rules can come from registered states' .urls, calling .when(), or calling .rule().
It's possible that two or more URL Rules could match the URL.

Previously

Previously, url rules were matched in the order in which they were registered.
The rule which was registered first would handle the URL change.

Now

Now, the URL rules are sorted according to a sort function.
More specific rules are preferred over less specific rules

Why

It's possible to have multiple url rules that match a given URL.
Consider the following states:

  • { name: 'books', url: '/books/index' }''
  • { name: 'book', url: '/books/:bookId' }''

Both states match when the url is /books/index.
Additionally, you might have some custom url rewrite rules such as:

.when('/books/list', '/books/index').

The book state also matches when the rewrite rule is matched.

Previously, we simply used the first rule that matched. However, now that lazy loading is officially supported, it can be difficult for developers to ensure the rules are registered in the right order.

Instead, we now prioritize url rules by how specific they are. More specific rules are matched earlier than less specific rules.
We split the path on /. A static segment (such as index in the example) is more specific than a parameter (such as:bookId).

More Details

The built-in rule sorting function (see UrlRouter.defaultRuleSortFn) sorts rules in this order:

  • Explicit priority: .when('/foo', '/bar', { priority: 1 }) (default priority is 0)
  • Rule Type:
    • UrlMatchers first (registered states and .when(string, ...))
    • then regular Expressions (.when(regexp, ...))
    • finally, everything else (.rule())
  • UrlMatcher specificity: static path segments are more specific than variables (see UrlMatcher.compare)
  • Registration order (except for UrlMatcher based rules)

For complete control, a custom sort function can be registered with UrlService.rules.sort(sortFn)

Query params

Because query parameters are optional, they are not considered during sorting.
For example, both these rules will match when the url is '/foo/bar':

.when('/foo/bar', doSomething);
.when('/foo/bar?queryparam', doSomethingElse);

To choose the most specific rule, we match both rules, then choose the rule with the "best ratio" of matched optional parameters (see UrlRuleFactory.fromUrlMatcher)

This allows child states to be defined with only query params for a URL.
The state only activates when the query parameter is present.

.state('parent', { url: '/parent' });
.state('parent.child', { url: '?queryParam' });

Restoring the previous behavior

For backwards compatibility, register a sort function which sorts by the registration order:

myApp.config(function ($urlServiceProvider) {

  function sortByRegistrationOrder(a, b) {
   return a.$id - b.$id;
  }

  $urlServiceProvider.rules.sort(sortByRegistrationOrder);

});

BREAKING CHANGE: Replace LocationServices.setUrl with LocationServices.url

This makes url() a getter/setter. It also adds the optional state parameter to pass through to the browser history when using pushstate.
End users should not notice this change, but plugin authors may.

BREAKING CHANGE: Replace UrlRouterProvider/UrlRouter with just UrlRouter

The configuration functions from the provider object have been integrated into the normal UrlRouter object.
The UIRouter object no longer has a uriRouterProvider, but the equivalent functions can be found on uiRouter

One difference between the old functions on urlRouterProvider and the new ones on uriRouter is that new functions do not accept injectable functions.

BREAKING CHANGE: Built-in string parameter type no longer encodes slashes as ~2F nor tildes as ~~

Previously, the string parameter type pre-encoded tilde chars (~) as two tilde chars (~~) and slashes (/) as ~2F.

Now, the string parameter type does not pre-encode slashes nor tildes.
If you rely on the previous encoding, create a custom parameter type that implements the behavior:

urlMatcherFactory.type('tildes', {
  encode: (val: any) =>
      val != null ? val.toString().replace(/(~|\/)/g, m => ({ '~': '~~', '/': '~2F' }[m])) : val;
  decode: (val: string) =>
      val != null ? val.toString().replace(/(~~|~2F)/g, m => ({ '~~': '~', '~2F': '/' }[m])) : val;
  pattern: /[^/]*/
});

BREAKING CHANGE: Remove getResolveValue and getResolvable methods from Transition in favor of injector().get() and injector().getAsync()

In beta.3, the Transition APIs: injector(), getResolvable, and getResolveValue duplicated functionality.

Instead of:

trans.getResolveValue('myResolve');

use:

trans.injector().get('myResolve')

BREAKING CHANGE: (CoreServices) Move location and locationConfig from services to UIRouter.locationService and UIRouter.locationConfig.

The core services object is a mutable object which each framework was monkey patching.
This change removes the requirement to monkey patch a global mutable object.
Instead, framework implementors should pass the LocationServices and LocationConfig implementations into the UIRouter constructor.

End Users

End users who were accessing services.location or services.locationConfig should access these off the UIRouter instance instead.

BREAKING CHANGE: Move html5Mode and hashPrefix from LocationServices to LocationConfig interface

End users should not notice

BREAKING CHANGE: move ViewService.viewConfigFactory and rootContext to _pluginapi.*

This BC happened in commit 6c42285

BREAKING CHANGE: Move html5Mode and hashPrefix to LocationServices from LocationConfig

BREAKING CHANGE: Future States names must end with .**, i.e., foo.bar.**

Previously, a state with a lazyLoad function was considered a future state.
Now, a state whose name ends with .** (i.e., a glob pattern which matches all children) is a future state.

All future states should be given a name that ends in .**.

Change your future states from:

{ name: 'future', url: '/future', lazyLoad: () => ... }

to:

{ name: 'future.**', url: '/future', lazyLoad: () => ... }

BREAKING CHANGE: Path/Query parameters no longer default to string param type

Previously, if a url parameter's type was not specified (in either the path or query), it defaulted to the string type.

Now, path parameters default to the new path type and query parameters default to the new query type.

angular - 1.0.0-beta.3

Published by christopherthielen about 8 years ago

angular -

Published by christopherthielen about 8 years ago

angular -

Published by christopherthielen about 8 years ago

angular -

Published by christopherthielen about 8 years ago

angular -

Published by christopherthielen about 8 years ago

angular -

Published by christopherthielen about 8 years ago