Skip to content

Commit e0dbb73

Browse files
docs($state): improve stateProvider.state() docs
1 parent d024027 commit e0dbb73

File tree

3 files changed

+220
-38
lines changed

3 files changed

+220
-38
lines changed

Gruntfile.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ module.exports = function (grunt) {
116116
ngdocs: {
117117
options: {
118118
dest: 'site',
119+
styles: [ 'ngdoc_assets/uirouter-docs.css' ],
119120
html5Mode: false,
120121
title: 'UI Router',
121122
startPage: '/api/ui.router',
@@ -132,11 +133,18 @@ module.exports = function (grunt) {
132133
grunt.registerTask('default', ['build', 'jshint', 'karma:unit']);
133134
grunt.registerTask('build', 'Perform a normal build', ['concat', 'uglify']);
134135
grunt.registerTask('dist', 'Perform a clean build', ['clean', 'build']);
135-
grunt.registerTask('dist-docs', 'Perform a clean build and generate documentation', ['dist', 'ngdocs']);
136+
grunt.registerTask('dist-docs', 'Perform a clean build and generate documentation', ['dist', 'ngdocs', 'widedocs']);
136137
grunt.registerTask('release', 'Tag and perform a release', ['prepare-release', 'dist', 'perform-release']);
137138
grunt.registerTask('dev', 'Run dev server and watch for changes', ['build', 'connect:server', 'karma:background', 'watch']);
138139
grunt.registerTask('sample', 'Run connect server with keepalive:true for sample app development', ['connect:sample']);
139140

141+
grunt.registerTask('widedocs', 'Convert to bootstrap container-fluid', function () {
142+
promising(this,
143+
system('sed -i.bak -e \'s/class="row"/class="row-fluid"/\' -e \'s/role="main" class="container"/role="main" class="container-fluid"/\' site/index.html')
144+
);
145+
});
146+
147+
140148
grunt.registerTask('publish-pages', 'Publish a clean build, docs, and sample to github.io', function () {
141149
promising(this,
142150
ensureCleanMaster().then(function () {

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
"karma-phantomjs-launcher": "~0.1.0",
6262
"load-grunt-tasks": "~0.4.0",
6363
"grunt-conventional-changelog": "~1.1.0",
64-
"grunt-ngdocs": "~0.2.6"
64+
"grunt-ngdocs": "git://github.com/christopherthielen/grunt-ngdocs#issue-86"
6565
},
6666
"main": "release/angular-ui-router.js"
6767
}

src/state.js

+210-36
Original file line numberDiff line numberDiff line change
@@ -367,9 +367,12 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory) {
367367
* Registers a state configuration under a given state name. The stateConfig object
368368
* has the following acceptable properties.
369369
*
370+
* @param {string} name A unique state name, e.g. "home", "about", "contacts".
371+
* To create a parent/child state use a dot, e.g. "about.sales", "home.newest".
372+
* @param {object} stateConfig State configuration object.
373+
* @param {string|function=} stateConfig.template
370374
* <a id='template'></a>
371-
*
372-
* - **`template`** - {string|function=} - html template as a string or a function that returns
375+
* html template as a string or a function that returns
373376
* an html template as a string which should be used by the uiView directives. This property
374377
* takes precedence over templateUrl.
375378
*
@@ -378,94 +381,268 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory) {
378381
* - {array.&lt;object&gt;} - state parameters extracted from the current $location.path() by
379382
* applying the current state
380383
*
384+
* <pre>template:
385+
* "<h1>inline template definition</h1>" +
386+
* "<div ui-view></div>"</pre>
387+
* <pre>template: function(params) {
388+
* return "<h1>generated template</h1>"; }</pre>
389+
* </div>
390+
*
391+
* @param {string|function=} stateConfig.templateUrl
381392
* <a id='templateUrl'></a>
382393
*
383-
* - **`templateUrl`** - {string|function=} - path or function that returns a path to an html
394+
* path or function that returns a path to an html
384395
* template that should be used by uiView.
385396
*
386397
* If `templateUrl` is a function, it will be called with the following parameters:
387398
*
388399
* - {array.&lt;object&gt;} - state parameters extracted from the current $location.path() by
389400
* applying the current state
390401
*
391-
* <a id='templateProvider'></a>
402+
* <pre>templateUrl: "home.html"</pre>
403+
* <pre>templateUrl: function(params) {
404+
* return myTemplates[params.pageId]; }</pre>
392405
*
393-
* - **`templateProvider`** - {function=} - Provider function that returns HTML content
394-
* string.
406+
* @param {function=} stateConfig.templateProvider
407+
* <a id='templateProvider'></a>
408+
* Provider function that returns HTML content string.
409+
* <pre> templateProvider:
410+
* function(MyTemplateService, params) {
411+
* return MyTemplateService.getTemplate(params.pageId);
412+
* }</pre>
395413
*
414+
* @param {string|function=} stateConfig.controller
396415
* <a id='controller'></a>
397416
*
398-
* - **`controller`** - {string|function=} - Controller fn that should be associated with newly
417+
* Controller fn that should be associated with newly
399418
* related scope or the name of a registered controller if passed as a string.
419+
* Optionally, the ControllerAs may be declared here.
420+
* <pre>controller: "MyRegisteredController"</pre>
421+
* <pre>controller:
422+
* "MyRegisteredController as fooCtrl"}</pre>
423+
* <pre>controller: function($scope, MyService) {
424+
* $scope.data = MyService.getData(); }</pre>
400425
*
426+
* @param {function=} stateConfig.controllerProvider
401427
* <a id='controllerProvider'></a>
402428
*
403-
* - **`controllerProvider`** - {function=} - Injectable provider function that returns
404-
* the actual controller or string.
429+
* Injectable provider function that returns the actual controller or string.
430+
* <pre>controllerProvider:
431+
* function(MyResolveData) {
432+
* if (MyResolveData.foo)
433+
* return "FooCtrl"
434+
* else if (MyResolveData.bar)
435+
* return "BarCtrl";
436+
* else return function($scope) {
437+
* $scope.baz = "Qux";
438+
* }
439+
* }</pre>
405440
*
441+
* @param {string=} stateConfig.controllerAs
406442
* <a id='controllerAs'></a>
407443
*
408-
* - **`controllerAs`** – {string=} – A controller alias name. If present the controller will be
444+
* A controller alias name. If present the controller will be
409445
* published to scope under the controllerAs name.
446+
* <pre>controllerAs: "myCtrl"</pre>
410447
*
448+
* @param {object=} stateConfig.resolve
411449
* <a id='resolve'></a>
412450
*
413-
* - **`resolve`** - {object.&lt;string, function&gt;=} - An optional map of dependencies which
451+
* An optional map&lt;string, function&gt; of dependencies which
414452
* should be injected into the controller. If any of these dependencies are promises,
415-
* the router will wait for them all to be resolved or one to be rejected before the
416-
* controller is instantiated. If all the promises are resolved successfully, the values
417-
* of the resolved promises are injected and $stateChangeSuccess event is fired. If any
418-
* of the promises are rejected the $stateChangeError event is fired. The map object is:
453+
* the router will wait for them all to be resolved before the controller is instantiated.
454+
* If all the promises are resolved successfully, the $stateChangeSuccess event is fired
455+
* and the values of the resolved promises are injected into any controllers that reference them.
456+
* If any of the promises are rejected the $stateChangeError event is fired.
457+
*
458+
* The map object is:
419459
*
420460
* - key - {string}: name of dependency to be injected into controller
421461
* - factory - {string|function}: If string then it is alias for service. Otherwise if function,
422462
* it is injected and return value it treated as dependency. If result is a promise, it is
423463
* resolved before its value is injected into controller.
424464
*
465+
* <pre>resolve: {
466+
* myResolve1:
467+
* function($http, $stateParams) {
468+
* return $http.get("/api/foos/"+stateParams.fooID);
469+
* }
470+
* }</pre>
471+
*
472+
* @param {string=} stateConfig.url
425473
* <a id='url'></a>
426474
*
427-
* - **`url`** - {string=} - A url with optional parameters. When a state is navigated or
475+
* A url fragment with optional parameters. When a state is navigated or
428476
* transitioned to, the `$stateParams` service will be populated with any
429477
* parameters that were passed.
430478
*
431-
* <a id='params'></a>
432-
*
433-
* - **`params`** - {object=} - An array of parameter names or regular expressions. Only
434-
* use this within a state if you are not using url. Otherwise you can specify your
435-
* parameters within the url. When a state is navigated or transitioned to, the
436-
* $stateParams service will be populated with any parameters that were passed.
479+
* examples:
480+
* <pre>url: "/home"
481+
* url: "/users/:userid"
482+
* url: "/books/{bookid:[a-zA-Z_-]}"
483+
* url: "/books/{categoryid:int}"
484+
* url: "/books/{publishername:string}/{categoryid:int}"
485+
* url: "/messages?before&after"
486+
* url: "/messages?{before:date}&{after:date}"</pre>
487+
* url: "/messages/:mailboxid?{before:date}&{after:date}"
437488
*
489+
* @param {object=} stateConfig.views
438490
* <a id='views'></a>
491+
* an optional map&lt;string, object&gt; which defined multiple views, or targets views
492+
* manually/explicitly.
439493
*
440-
* - **`views`** - {object=} - Use the views property to set up multiple views or to target views
441-
* manually/explicitly.
494+
* Examples:
442495
*
443-
* <a id='abstract'></a>
496+
* Targets three named `ui-view`s in the parent state's template
497+
* <pre>views: {
498+
* header: {
499+
* controller: "headerCtrl",
500+
* templateUrl: "header.html"
501+
* }, body: {
502+
* controller: "bodyCtrl",
503+
* templateUrl: "body.html"
504+
* }, footer: {
505+
* controller: "footCtrl",
506+
* templateUrl: "footer.html"
507+
* }
508+
* }</pre>
509+
*
510+
* Targets named `ui-view="header"` from grandparent state 'top''s template, and named `ui-view="body" from parent state's template.
511+
* <pre>views: {
512+
* 'header@top': {
513+
* controller: "msgHeaderCtrl",
514+
* templateUrl: "msgHeader.html"
515+
* }, 'body': {
516+
* controller: "messagesCtrl",
517+
* templateUrl: "messages.html"
518+
* }
519+
* }</pre>
444520
*
445-
* - **`abstract`** - {boolean=} - An abstract state will never be directly activated,
521+
* @param {boolean=} [stateConfig.abstract=false]
522+
* <a id='abstract'></a>
523+
* An abstract state will never be directly activated,
446524
* but can provide inherited properties to its common children states.
525+
* <pre>abstract: true</pre>
447526
*
527+
* @param {function=} stateConfig.onEnter
448528
* <a id='onEnter'></a>
449529
*
450-
* - **`onEnter`** - {object=} - Callback function for when a state is entered. Good way
530+
* Callback function for when a state is entered. Good way
451531
* to trigger an action or dispatch an event, such as opening a dialog.
452-
* If minifying your scripts, make sure to use the `['injection1', 'injection2', function(injection1, injection2){}]` syntax.
532+
* If minifying your scripts, make sure to explictly annotate this function,
533+
* because it won't be automatically annotated by your build tools.
534+
*
535+
* <pre>onEnter: function(MyService, $stateParams) {
536+
* MyService.foo($stateParams.myParam);
537+
* }</pre>
453538
*
539+
* @param {function=} stateConfig.onExit
454540
* <a id='onExit'></a>
455541
*
456-
* - **`onExit`** - {object=} - Callback function for when a state is exited. Good way to
542+
* Callback function for when a state is exited. Good way to
457543
* trigger an action or dispatch an event, such as opening a dialog.
458-
* If minifying your scripts, make sure to use the `['injection1', 'injection2', function(injection1, injection2){}]` syntax.
544+
* If minifying your scripts, make sure to explictly annotate this function,
545+
* because it won't be automatically annotated by your build tools.
459546
*
547+
* <pre>onExit: function(MyService, $stateParams) {
548+
* MyService.cleanup($stateParams.myParam);
549+
* }</pre>
550+
*
551+
* @param {boolean=} [stateConfig.reloadOnSearch=true]
460552
* <a id='reloadOnSearch'></a>
461553
*
462-
* - **`reloadOnSearch = true`** - {boolean=} - If `false`, will not retrigger the same state
554+
* If `false`, will not retrigger the same state
463555
* just because a search/query parameter has changed (via $location.search() or $location.hash()).
464556
* Useful for when you'd like to modify $location.search() without triggering a reload.
557+
* <pre>reloadOnSearch: false</pre>
465558
*
559+
* @param {object=} stateConfig.data
466560
* <a id='data'></a>
467561
*
468-
* - **`data`** - {object=} - Arbitrary data object, useful for custom configuration.
562+
* Arbitrary data object, useful for custom configuration. The parent state's `data` is
563+
* prototypally inherited. In other words, adding a data property to a state adds it to
564+
* the entire subtree via prototypal inheritance.
565+
*
566+
* <pre>data: {
567+
* requiredRole: 'foo'
568+
* } </pre>
569+
*
570+
* @param {object=} stateConfig.params
571+
* <a id='params'></a>
572+
*
573+
* A map which optionally configures parameters declared in the `url`, or
574+
* defines additional non-url parameters. For each parameter being
575+
* configured, add a configuration object keyed to the name of the parameter.
576+
*
577+
* Each parameter configuration object may contain the following properties:
578+
*
579+
* - ** value ** - {object|function=}: specifies the default value for this
580+
* parameter. This implicitly sets this parameter as optional.
581+
*
582+
* When UI-Router routes to a state and no value is
583+
* specified for this parameter in the URL or transition, the
584+
* default value will be used instead. If `value` is a function,
585+
* it will be injected and invoked, and the return value used.
586+
*
587+
* *Note*: `undefined` is treated as "no default value" while `null`
588+
* is treated as "the default value is `null`".
589+
*
590+
* *Shorthand*: If you only need to configure the default value of the
591+
* parameter, you may use a shorthand syntax. In the **`params`**
592+
* map, instead mapping the param name to a full parameter configuration
593+
* object, simply set map it to the default parameter value, e.g.:
594+
*
595+
* <pre>// define a parameter's default value
596+
* params: {
597+
* param1: { value: "defaultValue" }
598+
* }
599+
* // shorthand default values
600+
* params: {
601+
* param1: "defaultValue",
602+
* param2: "param2Default"
603+
* }</pre>
604+
*
605+
* - ** array ** - {boolean=}: *(default: false)* If true, the param value will be
606+
* treated as an array of values. If you specified a Type, the value will be
607+
* treated as an array of the specified Type. Note: query parameter values
608+
* default to a special `"auto"` mode.
609+
*
610+
* For query parameters in `"auto"` mode, if multiple values for a single parameter
611+
* are present in the URL (e.g.: `/foo?bar=1&bar=2&bar=3`) then the values
612+
* are mapped to an array (e.g.: `{ foo: [ '1', '2', '3' ] }`). However, if
613+
* only one value is present (e.g.: `/foo?bar=1`) then the value is treated as single
614+
* value (e.g.: `{ foo: '1' }`).
615+
*
616+
* <pre>params: {
617+
* param1: { array: true }
618+
* }</pre>
619+
*
620+
* - ** squash ** - {bool|string=}: `squash` configures how a default parameter value is represented in the URL when
621+
* the current parameter value is the same as the default value. If `squash` is not set, it uses the
622+
* configured default squash policy.
623+
* (See {@link ui.router.util.$urlMatcherFactory#methods_defaultSquashPolicy `defaultSquashPolicy()`})
624+
*
625+
* There are three squash settings:
626+
*
627+
* - false: The parameter's default value is not squashed. It is encoded and included in the URL
628+
* - true: The parameter's default value is omitted from the URL. If the parameter is preceeded and followed
629+
* by slashes in the state's `url` declaration, then one of those slashes are omitted.
630+
* This can allow for cleaner looking URLs.
631+
* - `"<arbitrary string>"`: The parameter's default value is replaced with an arbitrary placeholder of your choice.
632+
*
633+
* <pre>params: {
634+
* param1: {
635+
* value: "defaultId",
636+
* squash: true
637+
* } }
638+
* // squash "defaultValue" to "~"
639+
* params: {
640+
* param1: {
641+
* value: "defaultValue",
642+
* squash: "~"
643+
* } }
644+
* </pre>
645+
*
469646
*
470647
* @example
471648
* <pre>
@@ -474,7 +651,7 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory) {
474651
* // stateName can be a single top-level name (must be unique).
475652
* $stateProvider.state("home", {});
476653
*
477-
* // Or it can be a nested state name. This state is a child of the
654+
* // Or it can be a nested state name. This state is a child of the
478655
* // above "home" state.
479656
* $stateProvider.state("home.newest", {});
480657
*
@@ -488,9 +665,6 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory) {
488665
* .state("contacts", {});
489666
* </pre>
490667
*
491-
* @param {string} name A unique state name, e.g. "home", "about", "contacts".
492-
* To create a parent/child state use a dot, e.g. "about.sales", "home.newest".
493-
* @param {object} definition State configuration object.
494668
*/
495669
this.state = state;
496670
function state(name, definition) {

0 commit comments

Comments
 (0)