在Polymer中动态发布属性

时间:2015-02-14 19:13:13

标签: attributes polymer

是否可以在运行时发布新的Polymer组件属性?

<polymer-element name="dynamic-attributes">
    <template></template>
    <script>
        Polymer('dynamic-attributes', {
            ready: function(){
                var attributes = new Thing().getAttributes();
                this.publishAttributes(attributes); // imaginary method         
            },
        });
    </script>
</polymer-element>

更多信息......

我正在编写一个包装Seriously.js的组件库。

以下是理想实施的示例。

<seriously-graph linear>
    <seriously-source>
        <img src="images/pencils.jpg">
    </seriously-source>
    <seriously-effect type="pixelate" pixelSize="{{pixelSize}}"></seriously-effect>
    <seriously-effect type="blur" amount=".5"></seriously-effect>
    <seriously-target width="411" height="425"></seriously-target>
</seriously-graph>

我有一个使用MutationObserver来检测属性更改的变通方法。它工作,但后来我必须找到序列化的解决方案,并使属性getter / setter。感觉就像我正在重新发明轮子(聚合物),并希望有一种内置的方法来做到这一点。

3 个答案:

答案 0 :(得分:1)

这是一个Gist,可以满足您的需求。基本上,它会在第一次使用时动态创建具体 <polymer-element>,然后使用动态创建的具体<交换通用实例/ em>一,复制过程中的任何绑定声明。来源是:

<seriously-effect type="blur" amount="{{someAmount}}"></seriously-effect>

但是使用Inspect Element,你会看到:

<seriously-effect-blur amount="{{someAmount}}"></seriously-effect-blur>

答案 1 :(得分:0)

是的,可以通过为发布节点分配属性对象来实现。有关详细信息,请参阅https://www.polymer-project.org/docs/polymer/polymer.html#attributes

您的方法必须返回属性对象:

Polymer('dynamic-attributes', {
  publish: (new Thing()).getAttributes() || {}
});

答案 2 :(得分:0)

也许你可以创建一个全局数组并将其用作属性?

<polymer-element name="app-globals" attributes="values">
  <script>
    (function() {
      var values = {};

      Polymer({
         ready: function() {
           this.values = values;
           for (var i = 0; i < this.attributes.length; ++i) {
             var attr = this.attributes[i];
             values[attr.nodeName] = attr.value;
           }
         }
      });
    })();
  </script>
</polymer-element>

<app-globals id='myDynamicFunctions' someFunction someOtherFunction></app-globals>

<script>
    //then define it
    document.$.myDynamicFunctions.values.someFunction = function(){...}
</script>

我不太确定你在寻找什么,这可能会给你一个暗示......