aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/services.js79
1 files changed, 39 insertions, 40 deletions
diff --git a/src/services.js b/src/services.js
index 79bc75c4..f9133aca 100644
--- a/src/services.js
+++ b/src/services.js
@@ -25,62 +25,61 @@ angularServiceInject("$location", function(browser) {
scope.$eval();
}
});
-
+
this.$onEval(PRIORITY_FIRST, updateBrowser);
this.$onEval(PRIORITY_LAST, updateBrowser);
-
+
update(lastLocationHref);
lastLocationHash = location.hash;
-
+
return location;
-
+
// PUBLIC METHODS
-
+
/**
* Update location object
* Does not immediately update the browser
* Browser is updated at the end of $eval()
- *
+ *
* @example
* scope.$location.update('http://www.angularjs.org/path#hash?search=x');
* scope.$location.update({host: 'www.google.com', protocol: 'https'});
* scope.$location.update({hashPath: '/path', hashSearch: {a: 'b', x: true}});
- *
+ *
* @param {String | Object} Full href as a string or hash object with properties
*/
function update(href) {
if (isString(href)) {
extend(location, parseHref(href));
- }
- else {
+ } else {
if (isDefined(href.hash)) {
extend(href, parseHash(href.hash));
}
-
+
extend(location, href);
-
+
if (isDefined(href.hashPath || href.hashSearch)) {
location.hash = composeHash(location);
}
-
+
location.href = composeHref(location);
}
}
-
+
/**
* Update location hash
* @see update()
- *
+ *
* @example
* scope.$location.updateHash('/hp')
* ==> update({hashPath: '/hp'})
- *
+ *
* scope.$location.updateHash({a: true, b: 'val'})
* ==> update({hashSearch: {a: true, b: 'val'}})
- *
+ *
* scope.$location.updateHash('/hp', {a: true})
* ==> update({hashPath: '/hp', hashSearch: {a: true}})
- *
+ *
* @param {String | Object} hashPath as String or hashSearch as Object
* @param {String | Object} hashPath as String or hashSearch as Object [optional]
*/
@@ -91,42 +90,42 @@ angularServiceInject("$location", function(browser) {
}
update(hash);
}
-
+
/**
* Returns string representation - href
- *
+ *
* @return {String} Location's href property
*/
function toString() {
updateLocation();
return location.href;
}
-
+
/**
* Cancel change of the location
- *
+ *
* Calling update(), updateHash() or setting a property does not immediately
* change the browser's url. Url is changed at the end of $eval()
- *
+ *
* By calling this method, you can cancel the change (before end of $eval())
- *
+ *
*/
function cancel() {
update(lastLocationHref);
}
-
+
// INNER METHODS
/**
* Update location object
- *
+ *
* User is allowed to change properties, so after property change,
* location object is not in consistent state.
- *
+ *
* @example
* scope.$location.href = 'http://www.angularjs.org/path#a/b'
* immediately after this call, other properties are still the old ones...
- *
+ *
* This method checks the changes and update location to the consistent state
*/
function updateLocation() {
@@ -138,14 +137,14 @@ angularServiceInject("$location", function(browser) {
}
update(location.href);
}
-
+
/**
* If location has changed, update the browser
* This method is called at the end of $eval() phase
*/
function updateBrowser() {
updateLocation();
-
+
if (location.href != lastLocationHref) {
browser.setUrl(lastLocationHref = location.href);
lastLocationHash = location.hash;
@@ -154,7 +153,7 @@ angularServiceInject("$location", function(browser) {
/**
* Compose href string from a location object
- *
+ *
* @param {Object} Location object with all properties
* @return {String} Composed href
*/
@@ -166,10 +165,10 @@ angularServiceInject("$location", function(browser) {
(port ? ':' + port : '') + loc.path +
(url ? '?' + url : '') + (loc.hash ? '#' + loc.hash : '');
}
-
+
/**
* Compose hash string from location object
- *
+ *
* @param {Object} Object with hashPath and hashSearch properties
* @return {String} Hash string
*/
@@ -180,14 +179,14 @@ angularServiceInject("$location", function(browser) {
/**
* Parse href string into location object
- *
+ *
* @param {String} Href
* @return {Object} Location
*/
function parseHref(href) {
var loc = {};
var match = URL_MATCH.exec(href);
-
+
if (match) {
loc.href = href.replace('#$', '');
loc.protocol = match[1];
@@ -196,29 +195,29 @@ angularServiceInject("$location", function(browser) {
loc.path = match[6];
loc.search = parseKeyValue(match[8]);
loc.hash = match[10] || '';
-
+
extend(loc, parseHash(loc.hash));
}
-
+
return loc;
}
-
+
/**
* Parse hash string into object
- *
+ *
* @param {String} Hash
* @param {Object} Object with hashPath and hashSearch properties
*/
function parseHash(hash) {
var h = {};
var match = HASH_MATCH.exec(hash);
-
+
if (match) {
h.hash = hash;
h.hashPath = unescape(match[1] || '');
h.hashSearch = parseKeyValue(match[3]);
}
-
+
return h;
}
}, ['$browser'], EAGER_PUBLISHED);