0

我正在尝试添加一个事件侦听器以根据在 Vaadin ComboBox 中选择的模式显示图像。为此,我希望有一个事件侦听器...当 ComboBox 值更改时,然后在 JSON 文件中查找图像的路径并在 div 占位符上显示所选图像。

我还没有构建到那个级别的解决方案,因为我的查询选择器有问题。据我了解,它无法创建变量“组合框”,因此事件处理程序不会被添加到“组合框”中,因为它不存在。

加载页面的错误输出是:

Uncaught TypeError: Cannot read property 'addEventListener' of null

该项目的代码是:

<div id="patternSelect">
            <template is="dom-bind" id="paver">
              <div class="fieldset">
                <vaadin-combo-box id="cb1" label="Pattern" class="patterns" items="[[patterns]]"></vaadin-combo-box>
                <br>
                <vaadin-combo-box id="cb2" label="Color" class="colors" items="[[colors]]"></vaadin-combo-box>
              </div>
            </template>
        </div>


<script type="text/javascript">
    $( document ).ready(function() {
            var combobox = document.querySelector('#cb1');
            combobox.addEventListener('value-changed', function(event) {
              console.log(event.detail.value);
            });

            combobox.addEventListener('selected-item-changed', function(event) {
              console.log(event.detail.value);
        });
    });
</script>
4

1 回答 1

1

由于组合框嵌套在template标签内:

<template is="dom-bind" id="paver">

此模板的内容在它被激活并因此添加到 DOM 之前无法访问,请查看本教程

Vaadin/Polymer 将在加载时查看这些模板并激活它们,因此当您运行代码时,它看起来好像此操作尚未完成 - 导致您document.querySelector('#cb1')返回null.

一个粗略的解决方法是将您的侦听器代码包装在超时中,一切正常:

$( document ).ready(function() {
       addListenersDelayed()
    });
});

function  addListenersDelayed(){
    setTimeout( function(){
        addListeners();
    }, 1000)    
};  

function addListeners(){

    combobox.addEventListener('value-changed', function(event) {
        console.log(event.detail.value);
    });

    combobox.addEventListener('selected-item-changed', function(event) {
        console.log(event.detail.value);
    });
}

另一种方法是使用Polymer 生活方式回调

// select your template
var paver = document.querySelector('#paver');

// define the ready function callback
paver.ready = function () {
    // use the async method to make sure you can access parent/siblings
    this.async(function() {
    // access sibling or parent elements here
        var combobox = document.querySelector('#cb1')

        combobox.addEventListener('value-changed', function(event) {
            console.log(event.detail.value);
        });

        combobox.addEventListener('selected-item-changed', function(event) {
            console.log(event.detail.value);
        });

    });
};

这个的危险是组件在回调注册之前就准备好了。本质上,这两种方法都确保在执行代码时模板的 DOM 可用。

于 2016-04-18T14:58:53.697 回答