90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
<!--
 | 
						|
@license
 | 
						|
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
 | 
						|
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
 | 
						|
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
 | 
						|
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
 | 
						|
Code distributed by Google as part of the polymer project is also
 | 
						|
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 | 
						|
-->
 | 
						|
 | 
						|
<link rel="import" href="../polymer/polymer.html">
 | 
						|
 | 
						|
 | 
						|
<script>
 | 
						|
  'use strict';
 | 
						|
 | 
						|
  Polymer({
 | 
						|
    is: 'iron-query-params',
 | 
						|
    properties: {
 | 
						|
      paramsString: {
 | 
						|
        type: String,
 | 
						|
        notify: true,
 | 
						|
        observer: 'paramsStringChanged',
 | 
						|
      },
 | 
						|
      paramsObject: {
 | 
						|
        type: Object,
 | 
						|
        notify: true,
 | 
						|
        value: function() {
 | 
						|
          return {};
 | 
						|
        }
 | 
						|
      },
 | 
						|
      _dontReact: {
 | 
						|
        type: Boolean,
 | 
						|
        value: false
 | 
						|
      }
 | 
						|
    },
 | 
						|
    hostAttributes: {
 | 
						|
      hidden: true
 | 
						|
    },
 | 
						|
    observers: [
 | 
						|
      'paramsObjectChanged(paramsObject.*)'
 | 
						|
    ],
 | 
						|
    paramsStringChanged: function() {
 | 
						|
      this._dontReact = true;
 | 
						|
      this.paramsObject = this._decodeParams(this.paramsString);
 | 
						|
      this._dontReact = false;
 | 
						|
    },
 | 
						|
    paramsObjectChanged: function() {
 | 
						|
      if (this._dontReact) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      this.paramsString = this._encodeParams(this.paramsObject)
 | 
						|
          .replace(/%3F/g, '?').replace(/%2F/g, '/').replace(/'/g, '%27');
 | 
						|
    },
 | 
						|
    _encodeParams: function(params) {
 | 
						|
      var encodedParams = [];
 | 
						|
      for (var key in params) {
 | 
						|
        var value = params[key];
 | 
						|
        if (value === '') {
 | 
						|
          encodedParams.push(encodeURIComponent(key));
 | 
						|
        } else if (value) {
 | 
						|
          encodedParams.push(
 | 
						|
              encodeURIComponent(key) +
 | 
						|
              '=' +
 | 
						|
              encodeURIComponent(value.toString())
 | 
						|
          );
 | 
						|
        }
 | 
						|
      }
 | 
						|
      return encodedParams.join('&');
 | 
						|
    },
 | 
						|
    _decodeParams: function(paramString) {
 | 
						|
      var params = {};
 | 
						|
 | 
						|
      // Work around a bug in decodeURIComponent where + is not
 | 
						|
      // converted to spaces:
 | 
						|
      paramString = (paramString || '').replace(/\+/g, '%20');
 | 
						|
 | 
						|
      var paramList = paramString.split('&');
 | 
						|
      for (var i = 0; i < paramList.length; i++) {
 | 
						|
        var param = paramList[i].split('=');
 | 
						|
        if (param[0]) {
 | 
						|
          params[decodeURIComponent(param[0])] =
 | 
						|
              decodeURIComponent(param[1] || '');
 | 
						|
        }
 | 
						|
      }
 | 
						|
      return params;
 | 
						|
    }
 | 
						|
  });
 | 
						|
</script>
 |