1

I have this route

.state('mystate', {
    url: '/{id}',
    templateUrl: '/views/partial.html'
});

The id param should be a guid in form like this "2a542f61-5fff-4607-845d-972e6c3ad1e4". How do i add this in the url "url: '/{id:?what should i put here}'".

1

3 Answers 3

7

You can define your own type of parameter.

var GUID_REGEXP = /^[a-f\d]{8}-([a-f\d]{4}-){3}[a-f\d]{12}$/i;
$urlMatcherFactoryProvider.type('guid', {
  encode: angular.identity,
  decode: angular.identity,
  is: function(item) {
     return GUID_REGEXP.test(item);
  }
});

Here is a showcase on plunker with this solution

Then specify this type in url route expression:

.state('mystate', {
  url: '/{id?guid}',
  templateUrl: '/views/partial.html'
});

You can read more on that page in docs

Sign up to request clarification or add additional context in comments.

10 Comments

this is awesome. what is angular.identity? why do you put it in encode and decode? and in url, maybe you mean "{id:guid}" instead of "{id?guid}"
the regex does not work. The regex from radim kohler below works for me.
using $urlMatcherFactoryProvider.type failed if i have 2 states. '/{id?guid}' and '/create'
angular.identity is an utility function which always returns first argument. It is used to transform parameter value into url segment. Once you work with strings there is no need to do any transforms
@Reynaldi, I forked Radim's plunker and added type definition. It worked fine for me. Look at here: plnkr.co/edit/iEC71jK94OgmFJLc7Aa6?p=preview
|
6

There is a working plunker

We can just provide regexp in the url definition:

url: "/{id:(?:[a-fA-F0-9]{8}(?:-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12})}",

Read more about our options for url defintion:

http://angular-ui.github.io/ui-router/site/#/api/ui.router.util.type:UrlMatcher

small snippet:

'{' name ':' regexp|type '}' - curly placeholder with regexp or type name. Should the regexp itself contain curly braces, they must be in matched pairs or escaped with a backslash.

3 Comments

any idea to make it more compact? url: "{id:(?:[a-fA-F0-9]{8}(?:-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12})}{id2:(?:[a-fA-F0-9]{8}(?:-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12})}/{id3:(?:[a-fA-F0-9]{8}(?:-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12})}" does not look readable
If you are asking, I would be really open: do NOT use guid for url. Url should by user friendly as possible. That's just my position. But if you want to use it repetitively... we can use custom types, which do encapsulate that complexity. Check an example here: stackoverflow.com/a/30498590/1679310
thanks for your comment. i know guid are ugly, but unfortunately, changing it is not an option right now.
0

After much trial and error, I came up with:

$urlMatcherFactoryProvider.type('guid', {
    encode: angular.identity,
    decode: angular.identity,
    equals: function(a, b) { return a.toUpperCase() === b.toUpperCase(); },
    is: function(val) {
        // Local to avoid any lastIndex issues
        var GUID_REGEXP = /^[a-f\d]{8}-(?:[a-f\d]{4}-){3}[a-f\d]{12}$/i;
        return GUID_REGEXP.test(val);
    },
    // No anchors or flags with pattern
    pattern: /[a-fA-F\d]{8}-(?:[a-fA-F\d]{4}-){3}[a-fA-F\d]{12}/
});

This is based on @just-boris's answer. One key difference is pattern. Without this it appears that invalid GUIDs will not trigger $urlRouterProvider.otherwise().

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.