如何访问Polymer元素模板中js文件中定义的函数?

时间:2017-07-17 04:52:14

标签: javascript polymer-1.0 mixins polymer-2.x polymer-starter-kit

我在 global.function.js 文件中创建了一个函数

function getData(flag) {
if (flag === 1) {
  return "one";
 } 
else {
  return "not one";
 }
}
然后使用 custom-js-import.html 元素导入

<script src="global.function.js"></script>

当我尝试在 custom-element.html 中访问上述功能时,我可以在脚本部分访问它,但不能在模板部分访问它。 有什么办法可以访问HTML元素中的函数吗?

<!-- custom-element.html -->
<link rel="import"  href="https://polygit.org/components/polymer/polymer-element.html">
<link rel="import" href="custom-js-import.html">

<dom-module id="custom-element">

  <template>
    <div>
      Hello
    </div>
    <div id="data"></div>
    <div>{{getData(1)}}</div><!-- Unable to access this from here -->
    <div>{{getLocalData()}}</div>
  </template>

<script>
  // Define the class for a new element called custom-element
  class CustomElement extends Polymer.Element {
    static get is() { return "custom-element"; }
    constructor() {
        super();
      }

      ready(){
        super.ready();
        this.$.data.textContent = "I'm a custom-element.";
        console.log(getData(1));//can be easily accessed from here
      }

      getLocalData(){
        return "local";
      }

  }
  // Register the new element with the browser
  customElements.define(CustomElement.is, CustomElement);
</script>
</dom-module>

Sample Code

2 个答案:

答案 0 :(得分:1)

  

有什么办法可以访问HTML元素中的函数吗?

不是真的。为了在模板中使用数据,您需要将其绑定到属性(Polymer调用此数据绑定)。

Polymer的数据绑定系统设计用于将值绑定到模板。这些值通常只是文字(例如字符串和数字)或普通的javascript对象,例如{a: 'someval', b: 5} Polymer的数据绑定系统旨在将功能绑定到模板,您无法在模板中使用javascript。 {{3} }。

执行您尝试做的事情的聚合方式是使用(If you're really into that idea, check out React as a replacement to polymer)。而不是在模板内调用函数,创建一个计算属性,以响应其他变量的更改。当属性的状态发生变化时,计算属性也会发生变化。这种状态可以被认为是你职能的论据。

我觉得最好只看到代码正常工作(用chrome测试过)?

&#13;
&#13;
<link rel="import" href="https://polygit.org/components/polymer/polymer-element.html">
<link rel="import" href="custom-js-import.html">

<dom-module id="custom-element">

  <template>
    <div>
      Hello
    </div>
    <label>
      <input type="number" value="{{flag::input}}">
    </label>
    <h1>from flag: [[flag]]</h1>
    <div id="data"></div>
    <div>{{boundComputedData}}</div><!-- Unable to access this from here -->
    <div>{{getLocalData()}}</div>
  </template>

  <script>
    // Define the class for a new element called custom-element
    class CustomElement extends Polymer.Element {
      static get is() {
        return "custom-element";
      }
      constructor() {
        super();
      }

      getData(flag) {
        const flagAsNumber = parseInt(flag);
        if (flagAsNumber === 1) {
          return "one";
        } else {
          return "not one";
        }
      }

      ready() {
        super.ready();
        this.$.data.textContent = "I'm a custom-element.";
        console.log(this.getData(1)); //can be easily accessed from here
      }

      getLocalData() {
        return "local";
      }



      static get properties() {
        return {
          flag: {
            type: Number,
            value: 0
          },
          boundComputedData: {
            type: String,
            computed: 'getData(flag)'
          }
        };
      }

    }
    // Register the new element with the browser
    customElements.define(CustomElement.is, CustomElement);
  </script>
</dom-module>

<custom-element></custom-element>
&#13;
&#13;
&#13;

所以我在这里做的是:

创建计算属性boundComputedData并将computed属性设置为'getData(flag)',这将使其使用类函数getData

现在,只要状态flag发生更改,计算属性就会更新。

希望它有所帮助!

答案 1 :(得分:0)

感谢Rico Kahler建议我使用mixin。使用mixin解决了我的问题。您可以查看完整的工作示例here

可以在mixin中定义所有全局函数。

<!--custom-mixin.html-->
<script>
  const CustomMixin = superclass => class extends superclass {

static get properties() {
  return {};
}

connectedCallback() {
  super.connectedCallback();
}

getData(flag) {
   if (flag === 1) {
    return "one(From Mixin)";
   } else {
    return "not one(From Mixin)";
   }
  }
 };
</script>

请记住导入mixin文件并将mixin添加到元素中。

<!-- custom-element.html -->
<link rel="import" href="https://polygit.org/components/polymer/polymer-element.html">
<link rel="import" href="custom-mixin.html">

<dom-module id="custom-element">

  <template>
    <div>
      Hello
    </div>
    <div id="data"></div>
    <div>{{getData(1)}}</div>
    <!-- Unable to access this from here -->
    <div>{{getLocalData()}}</div>
  </template>

  <script>
    // Define the class for a new element called custom-element
    class CustomElement extends CustomMixin(Polymer.Element) {
        static get is() {
          return "custom-element";
        }
        constructor() {
          super();
        }

        ready() {
          super.ready();
          this.$.data.textContent = "I'm a custom-element.";
          console.log(getData(1)); //can be easily accessed from here
        }

        getLocalData() {
          return "local";
        }

      }
      // Register the new element with the browser
    customElements.define(CustomElement.is, CustomElement);
  </script>
</dom-module>