【问题标题】:Polymer 1.x: Defining "google" importPolymer 1.x:定义“google”导入
【发布时间】:2016-02-11 07:51:29
【问题描述】:

In this jsBin,我想以声明方式为 selected 属性预加载我的元素,其值为 ['Colorado', 'South Dakota']。

When I open this jsBin,我期待看到以下内容:

  1. ✅一个成功加载的页面。
  2. ✅一张美国的轮廓图
  3. ✅ 左上角 selected 变量的打印结果为 Colorado,South Dakota。
  4. ❌ 科罗拉多州和南达科他州预选并涂成蓝色。
  5. ❌ 控制台中没有错误。

相反,我实际上看到以下内容:

  1. ✅一个成功加载的页面。
  2. ✅一张美国的轮廓图
  3. ✅ 左上角 selected 变量的打印结果为 Colorado,South Dakota。
  4. ❌ 科罗拉多州和南达科他州没有预先选择或涂成蓝色。
  5. ❌ 以下控制台错误:
控制台错误

google is not defined

问题

如何在关键位置定义google 的值?

我已隔离问题down to the following lines of code。

http://jsbin.com/zomejajibe/1/edit?html,控制台,输出
_drawChart: function() {
  console.log('A'); // Successfully logs to console
  // The key is to get "google" defined at the following line
  var dataTable = this.$.geochart._createDataTable(this.items); // "google" is not defined???
  console.log('dataTable: '); // Does not successfully log because crashes above
  console.log(dataTable);
  this.$.geochart._chartObject.draw(dataTable, this.$.geochart.options);
},

【问题讨论】:

  • 如果您要从代码中删除重现问题并非绝对必要的所有内容,那么您获得答案的可能性就会大得多。通常,尽可能减少示例已经揭示了问题。在简要查看了您的 JSBin 之后,我决定不想花时间深入研究发生了什么,这可能对许多其他人来说都是一样的。
  • @GünterZöchbauer:好点。我会听从你的建议。谢谢。 +1
  • @GünterZöchbauer:FWIW,1. 我重构了代码以使逻辑更容易理解。 2. 这是一个正在进行的项目,因此会有一系列问题。因此,为理解代码而进行的非重复性时间投资将带来多个问题的回报。 (到目前为止,同一个项目有 16 个使用基本相同的代码。定期,大约每晚一个。) 3. 许多问题只涉及部分代码,您可以可能只需要很少的工作就可以编写一个解决方案。 4. 当完整的上下文发布时,我会找到最好的答案。
  • @GünterZöchbauer: Here is the latest (currently) unanswered question in the series... stackoverflow.com/questions/35378717/polymer-1-x-databinding ... 如前所述,逻辑现在更容易遵循。 使用相同代码库的更多问题(可能有 10 个左右)肯定会接踵而至!

标签: javascript data-binding polymer polymer-1.0


【解决方案1】:

所以你有问题,在元素准备好之前选择改变了触发器。

我在函数 _selectedChanged 上添加了 10 毫秒的超时,因此它会推送到事件循环的末尾。您可以将其更改为 0 毫秒。

看http://jsbin.com/quzuyuwaha/1/edit?html,console,output

【讨论】:

    【解决方案2】:

    具体来说,@Alon 添加了以下功能:

    http://jsbin.com/hulusijaje/1/edit?html,控制台,输出
    try: function(e) {
      var self = this;
      setTimeout(function() {
        self._selectedChanged(e)
      }.bind(self), 100)
    },
    

    并且解决方案的完整代码如下:

    http://jsbin.com/hulusijaje/1/edit?html,控制台,输出
    <!DOCTYPE html>
    
    <head>
      <meta charset="utf-8">
      <base href="https://polygit.org/components/">
      <script src="webcomponentsjs/webcomponents-lite.min.js"></script>
      <link href="polymer/polymer.html" rel="import">
      <link href="google-chart/google-chart.html" rel="import"> </head>
    
    <body>
      <dom-module id="x-element"> <template>
          <style>
            google-chart {
              width: 100%;
            }
          </style>
          <button on-tap="_show">Show</button>
          <div>[[selected]]</div>
          <google-chart
            id="geochart"
            type="geo"
            options="{{options}}"
            data="{{items}}"
            xon-google-chart-select="_onGoogleChartSelect"></google-chart>
        </template>
        <script>
          (function() {
            Polymer({
              is: 'x-element',
              /** /
               * Fired when user selects chart item.
               *
               * @event us-map-select
               * @param {object} detail Alpabetized array of selected state names.
              /**/
              properties: {
                selected: {
                  type: Array,
                  notify: true,
                  //reflectToAttribute: true,
                },
                items: {
                  type: Array,
                  notify: true,
                  reflectToAttribute: true,
                  value: function() {
                    return [
                      ['State', 'Select'],
                      ['Alabama', 0],
                      ['Alaska', 0],
                      ['Arizona', 0],
                      ['Arkansas', 0],
                      ['California', 0],
                      ['Colorado', 0],
                      ['Connecticut', 0],
                      ['Delaware', 0],
                      ['Florida', 0],
                      ['Georgia', 0],
                      ['Hawaii', 0],
                      ['Idaho', 0],
                      ['Illinois', 0],
                      ['Indiana', 0],
                      ['Iowa', 0],
                      ['Kansas', 0],
                      ['Kentucky', 0],
                      ['Louisiana', 0],
                      ['Maine', 0],
                      ['Maryland', 0],
                      ['Massachusetts', 0],
                      ['Michigan', 0],
                      ['Minnesota', 0],
                      ['Mississippi', 0],
                      ['Missouri', 0],
                      ['Montana', 0],
                      ['Nebraska', 0],
                      ['Nevada', 0],
                      ['New Hampshire', 0],
                      ['New Jersey', 0],
                      ['New Mexico', 0],
                      ['New York', 0],
                      ['North Carolina', 0],
                      ['North Dakota', 0],
                      ['Ohio', 0],
                      ['Oklahoma', 0],
                      ['Oregon', 0],
                      ['Pennsylvania', 0],
                      ['Rhode Island', 0],
                      ['South Carolina', 0],
                      ['South Dakota', 0],
                      ['Tennessee', 0],
                      ['Texas', 0],
                      ['Utah', 0],
                      ['Vermont', 0],
                      ['Virginia', 0],
                      ['Washington', 0],
                      ['West Virginia', 0],
                      ['Wisconsin', 0],
                      ['Wyoming', 0]
                    ];
                  },
                },
                color: {
                  type: String, // '#455A64'
                  value: function() {
                    return 'blue';
                  }
                },
                options: {
                  type: Object,
                  notify: true,
                  reflectToAttribute: true,
                  computed: '_computeOptions(color)',
                },
                itemIndices: {
                  type: Object,
                  computed: '_computeItemIndices(items)',
                },
              },
              observers: [
                // '_selectedChanged(selected.*)',
                'try(selected.*)'
                //'_drawChart(items.*, options)',
              ],
              ready: function() {
                var _this = this;
                this.$.geochart.addEventListener('google-chart-select', function(e) {
                  this._onGoogleChartSelect(e)
                }.bind(_this));
              },
              _computeItemIndices: function(a) {
                var out = {},
                  i = a.length;
                while (i--) {
                  out[a[i][0]] = i;
                }
                return out;
              },
              _onGoogleChartSelect: function(e) {
                var s = e.path[0].textContent.split('Select')[0].trim(), // e.g. 'Ohio'
                  temp = [],
                  a = this.items,
                  index = this.itemIndices[s], // e.g. 35
                  i = a.length;
                this.set('items.' + index + '.1', a[index][1] ? 0 : 1);
                while (i-- - 1) {
                  /** /
                  if(s === a[i][0]){
                    this.set('items.' + i + '.1', a[i][1] ? 0 : 1);
                    //this.items[i][1] = a[i][1] ? 0 : 1;
                  }
                  /**/
                  if (a[i][1]) {
                    temp.push(a[i][0]);
                  }
                }
                temp.sort();
                this.set('selected', temp);
                this._drawChart();
                //console.log(this.selected);
              },
              /**/
              _redrawChart: function() {
                var j = 1, // iterations
                  s = 1, // delay in seconds
                  _this = this;
                while (j--) {
                  try {
                    //  console.log(j);
                    _this._drawChart();
                    //return;
                  } catch (e) {
                    //   console.log(e.message);
                    setTimeout(function() {
                      //console.log(j);
                      console.log(_this.selected); // undefined
                    }, (s * 1000));
                    _this._drawChart();
                  }
                }
              },
              /**/
              _drawChart: function() {
                console.log('A'); // Successfully logs to console
                // The key is to get "google" defined at the following line
                try {
                  var dataTable = this.$.geochart._createDataTable(this.items); // "google" is not defined???
                  console.log('dataTable: '); // Does not successfully log because crashes above
                  // console.log(dataTable);
                  this.$.geochart._chartObject.draw(dataTable, this.$.geochart.options);
                } catch (e) {}
              },
              doAll: function(verb) {
                verb = verb || 'clear'; // verb: 'clear'(default)|'select'
                verb = (verb === 'select') ? 'select' : 'clear';
                this._doAll(verb);
                this._drawChart();
              },
              _doAll: function(verb) {
                var resetSelect = (verb && verb === 'some') ? false : true;
                verb = verb || 'clear'; // verb: 'clear'(default)|'select'|'some'
                verb = (verb === 'select') ? 'select' : 'clear';
                var temp = [];
                var items = this.items,
                  i = items.length;
                switch (verb) {
                  case 'select':
                    while (i-- - 1) {
                      items[i][1] = 1;
                      temp.push(items[i][0]);
                    }
                    break;
                  case 'clear':
                    while (i-- - 1) {
                      items[i][1] = 0;
                    }
                    break;
                  default:
                    break;
                }
                this.set('items', items);
                if (resetSelect) {
                  temp.sort();
                  this.set('selected', temp);
                }
              },
              try: function(e) {
                var self = this;
                setTimeout(function() {
                  self._selectedChanged(e)
                }.bind(self), 100)
              }, ////
              _selectedChanged: function(e, k) {
                console.log('selected');
                if (k === undefined) {
                  console.log(e);
                  ////  return
                } else {
                  console.log(k);
                }
                var a = e.base,
                  i = a.length;
                this._doAll('some');
                while (i--) {
                  var index = this.itemIndices[a[i]];
                  this.set('items.' + index + '.1', 1);
                }
                this._redrawChart();
                this.fire('us-map-select', this.selected);
                // console.log(this.selected);//
                //  console.log(this.items);
              },
              _computeOptions: function(s) {
                return {
                  region: 'US',
                  displayMode: 'regions',
                  resolution: 'provinces',
                  legend: 'none',
                  defaultColor: 'white',
                  colorAxis: {
                    colors: ['#E0E0E0', s],
                    minValue: 0,
                    maxValue: 1,
                  }
                }
              },
              _show: function() {
                //this.set('selected', ['Ohio', 'New Mexico']);
                this.doAll();
                //console.log(this.itemIndices);
              },
            });
          })();
        </script>
      </dom-module>
      <x-element xcolor="#455A64" selected='["Colorado", "South Dakota"]'></x-element>
    </body>
    
    </html>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多