【问题标题】:noUIslider not working in web component-polymer 3(litelement)noUIslider 在 Web 组件聚合物 3(litelement)中不起作用
【发布时间】:2019-03-21 08:00:31
【问题描述】:

我想知道如何在像 Polymer 3/LitElement 这样的 Web 组件中实现 noUiSlider,我尝试了下面的代码,错误为 nouislider.create is not function,服务器以 non-JavaScript MIME type of "text/css" 的响应结束。

import { LitElement, html } from 'https://unpkg.com/@polymer/lit-element/lit-element.js?module';
import * as  noUiSlider  from 'https://unpkg.com/nouislider/distribute/nouislider.min.js'
export class Filters extends LitElement { 
  constructor() {
    super();
   this.slider();
  }

  slider(){
    var range = document.getElementById('range');

    noUiSlider.create(range, {
        start: [ 20, 80 ], // Handle start position
        step: 10, // Slider moves in increments of '10'
        margin: 20, // Handles must be more than '20' apart
        connect: true, // Display a colored bar between the handles
        direction: 'rtl', // Put '0' at the bottom of the slider
        orientation: 'vertical', // Orient the slider vertically
        behaviour: 'tap-drag', // Move handle on tap, bar is draggable
        range: { // Slider can select '0' to '100'
            'min': 0,
            'max': 100
        },
        pips: { // Show a scale with the slider
            mode: 'steps',
            density: 2
        }
    });

    var valueInput = document.getElementById('value-input'),
    valueSpan = document.getElementById('value-span');

    // When the slider value changes, update the input and span
    range.noUiSlider.on('update', function( values, handle ) {
        if ( handle ) {
            valueInput.value = values[handle];
        } else {
            valueSpan.innerHTML = values[handle];
        }
    });

    // When the input changes, set the slider value
    valueInput.addEventListener('change', function(){
        range.noUiSlider.set([null, this.value]);
    });
  }
  render() {
    return html` 
     <div id="range"></div>   
    
    `;

【问题讨论】:

    标签: javascript html web-component polymer-3.x lit-element


    【解决方案1】:

    由于 HTML 的渲染时间,抛出 en 错误。所以你可以使用如下; * 还要检查如何在 shadow dom 中引用元素 this.shadowRoot.getElementById('range') 而不是 document.getElementById

    DEMO

    import { LitElement, html } from '@polymer/lit-element'; 
    import {afterNextRender } from '@polymer/polymer/lib/utils/render-status.js';
    import * as  noUiSlider  from 'https://unpkg.com/nouislider/distribute/nouislider.min.js'
    
    class MyFilters extends LitElement { 
    
      constructor() {
        super();
         afterNextRender(this, ()=>{ 
              this.slider();
        })
      }
    
      slider(){
    
         var range = this.shadowRoot.getElementById('range');
    
         noUiSlider.create(range, {
            start: [ 20, 80 ], // Handle start position
            step: 10, // Slider moves in increments of '10'
            margin: 20, // Handles must be more than '20' apart
            connect: true, // Display a colored bar between the handles
            direction: 'rtl', // Put '0' at the bottom of the slider
            orientation: 'vertical', // Orient the slider vertically
            behaviour: 'tap-drag', // Move handle on tap, bar is draggable
            range: { // Slider can select '0' to '100'
                'min': 0,
                'max': 100
            },
            pips: { // Show a scale with the slider
                mode: 'steps',
                density: 2
            }
        });
    
        var valueInput = this.shadowRoot.getElementById('value-input'),
        valueSpan = this.shadowRoot.getElementById('value-span');
    
        // When the slider value changes, update the input and span
        range.noUiSlider.on('update', function( values, handle ) {
            if ( handle ) {
                valueInput.value = values[handle];
            } else {
                valueSpan.innerHTML = values[handle];
            }
        });
    
        // When the input changes, set the slider value
        valueInput.addEventListener('change', function(){
            range.noUiSlider.set([null, this.value]);
        });
      }
    
      render() {
        return html` 
         <div id="range">
         <span id="value-span"></span>
         <input id="value-input"/>  
         </div> 
        `;
      }
    }
    customElements.define('my-filters', MyFilters);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多