-
Notifications
You must be signed in to change notification settings - Fork 27.4k
feat(location): add configurable attr to force html5mode link rewriting #14976
Conversation
@@ -877,6 +879,8 @@ function $LocationProvider() { | |||
if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; | |||
} | |||
|
|||
if (!html5Mode.rewriteLinks && isUndefined(elm.attr('ng-noserver'))) return; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This will not recognize prefixed forms (such as x-ng-...
or data-ng-...
) - and I think this is undesirable.
I think |
87a1dad
to
36e7a6d
Compare
Thanks @gkalpak, I was hoping to get this kind of useful feedback. I've updated the code. Please review at your leisure. |
* - **rewriteLinks** - `{boolean|String}` - (default: `true`) When html5Mode is enabled, | ||
* enables/disables url rewriting for relative links. If set to a string, url rewriting will | ||
* only happen on links with an attribute that matches the given string. For example, if set | ||
* to "internalLink", then the URL will only be rewritten for `<a internal-link>` links. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is no attribute name (de)normalization going on. In order to match <a internal-link>
you need to set rewriteLinks
to 'internal-link'
(not 'internalLink'
).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
Btw, docs need to be updated in other places (e.g. the |
36e7a6d
to
368d9bf
Compare
module(function($locationProvider) { | ||
$locationProvider.html5Mode({ | ||
enabled: 'duh', | ||
requireBase: 'probably', | ||
rewriteLinks: 'nope' | ||
rewriteLinks: false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This change doesn't test what it should. You need to supply an unsupported type and verify that it didn't get copied to the actual config.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
See this discussion: angular#14959 When using html5mode, sometimes it is necessary to not use the <base> tag in order to support SVG icons. An example of this is in the discussion linked above. When we do this, sometimes we also want to disable "rewriteLinks" so that we can still leave the Angular application via navigation. This feature allows the user to explicitly mark an <a> tag as a link that should not refresh from server, even if rewriteLinks is disabled.
368d9bf
to
5eae33d
Compare
LGTM |
I'll let @petebacondarwin do the final LGTM, since he is the |
@petebacondarwin Ping. Please review when convenient. |
LGTM |
… attribute In HTML5 mode, links can now be selectively rewritten, by setting `mode.rewriteLinks` to a string (denoting an attribute name). Anchor elements that have the specified attribute will be rewritten, while other links will remain untouched. This can be useful in situations where it is desirable to use HTML5 mode without a `<base>` tag, but still support rewriting specific links only. See #14959 for more details on a possible usecase. Closes #14976
… attribute In HTML5 mode, links can now be selectively rewritten, by setting `mode.rewriteLinks` to a string (denoting an attribute name). Anchor elements that have the specified attribute will be rewritten, while other links will remain untouched. This can be useful in situations where it is desirable to use HTML5 mode without a `<base>` tag, but still support rewriting specific links only. See angular#14959 for more details on a possible usecase. Closes angular#14976
… attribute In HTML5 mode, links can now be selectively rewritten, by setting `mode.rewriteLinks` to a string (denoting an attribute name). Anchor elements that have the specified attribute will be rewritten, while other links will remain untouched. This can be useful in situations where it is desirable to use HTML5 mode without a `<base>` tag, but still support rewriting specific links only. See angular#14959 for more details on a possible usecase. Closes angular#14976
… attribute In HTML5 mode, links can now be selectively rewritten, by setting `mode.rewriteLinks` to a string (denoting an attribute name). Anchor elements that have the specified attribute will be rewritten, while other links will remain untouched. This can be useful in situations where it is desirable to use HTML5 mode without a `<base>` tag, but still support rewriting specific links only. See angular#14959 for more details on a possible usecase. Closes angular#14976
… attribute In HTML5 mode, links can now be selectively rewritten, by setting `mode.rewriteLinks` to a string (denoting an attribute name). Anchor elements that have the specified attribute will be rewritten, while other links will remain untouched. This can be useful in situations where it is desirable to use HTML5 mode without a `<base>` tag, but still support rewriting specific links only. See angular#14959 for more details on a possible usecase. Closes angular#14976
… attribute In HTML5 mode, links can now be selectively rewritten, by setting `mode.rewriteLinks` to a string (denoting an attribute name). Anchor elements that have the specified attribute will be rewritten, while other links will remain untouched. This can be useful in situations where it is desirable to use HTML5 mode without a `<base>` tag, but still support rewriting specific links only. See angular#14959 for more details on a possible usecase. Closes angular#14976
… attribute In HTML5 mode, links can now be selectively rewritten, by setting `mode.rewriteLinks` to a string (denoting an attribute name). Anchor elements that have the specified attribute will be rewritten, while other links will remain untouched. This can be useful in situations where it is desirable to use HTML5 mode without a `<base>` tag, but still support rewriting specific links only. See #14959 for more details on a possible usecase. Closes #14976
… attribute In HTML5 mode, links can now be selectively rewritten, by setting `mode.rewriteLinks` to a string (denoting an attribute name). Anchor elements that have the specified attribute will be rewritten, while other links will remain untouched. This can be useful in situations where it is desirable to use HTML5 mode without a `<base>` tag, but still support rewriting specific links only. See #14959 for more details on a possible usecase. Closes #14976
What kind of change does this PR introduce? (Bug fix, feature, docs update, ...)
Feature
What is the current behavior? (You can also link to an open issue here)
When
rewriteLinks
is disabled in Location'shtml5mode
, all links are treated as if they should reload from the server.Also see this discussion: #14959
What is the new behavior (if this is a feature change)?
This allows the user to add an
ng-noserver
attribute to the<a>
tag, like this:<a href="somewhere" ng-noserver>click me</a>
to explicitly mark this link as one that should not reload from server, i.e. to use angular javascript routing instead.Does this PR introduce a breaking change?
No
Please check if the PR fulfills these requirements
Other information:
See this discussion: #14959
When using html5mode, sometimes it is necessary to not use the tag
in order to support SVG icons. An example of this is in the discussion
linked above.
When we do this, sometimes we also want to disable "rewriteLinks" so that
we can still leave the Angular application via navigation.
This feature allows the user to explicitly mark an tag as a link that
should not refresh from server, even if rewriteLinks is disabled.