获取聚合物 parent 元素

Get polymer parent element

所以我已经使用 Polymer 大约一天了,我在表达这个问题时遇到了问题,所以如果我的方法偏离了基础,请不要觉得有必要解决这个问题,而是指出我方向正确。

我拥有的是自定义元素中的自定义元素,我想要一个 child 元素来影响 parent 的属性。我采用的方法是创建一个点击处理程序,关闭 IIFE 中的 parent 元素,然后将该处理程序传递给子组件。像这样...

Polymer({
  ready: function(){
     this.superHandler = (function(p) {
        return function() {
          // "this" here will be the sub-component
          p.title = this.title;
        }
     })(this);
  }
});

parent 元素在其模板中使用它的地方,例如...

<polymer-element name="parent-element">
  <template>
    <sub-element on-click={{superHandler}} />
  </template>
</polymer-element>

这个(在我的真实代码中,虽然这里可能有拼写错误)在除 IE 之外的所有软件中都有效,我知道 IE 没有得到官方支持,但它是如此接近我不想放弃它。我想避免的事情是重复引用 parentNodes 和 shadowRoots 以获得我正在寻找的 parent。

编辑

我忘了提及它在 IE 中是如何失败的,以及为什么我想避免 parentNode 调用。在IE中,具体到polymer.js的第9131行去派发事件时,变量"method"和obj[method]中的引用在IE中都是字符串,所以没有method apply。我想避免 parentNode 的原因是因为调用者不是直接的 parent,所以我不想在找到合适的节点之前一直获取 parentNodes,因为当我可以命名变量时代码更容易理解。

编辑 2

我现在要做什么(因为它在 IE9 中工作),尽管我将问题悬而未决以获得更好的答案是继续使用 IIFE,返回一个函数,该函数接受一个参数,即 child。然后 child 将通过 querySelector 找到感兴趣的 parent。这意味着 child 必须具有 parent 的 fore-knowledge 和要调用的方法,这并不理想,但是... IE.

因此 parent 将其设置为...

Polymer('parent-element', {
  ready: function(){
     this.superHandler = (function(p) {
        return function(child) {
          p.title = chile.title;
        }
     })(this);
  }
});

并且 child 必须通过查询选择器获取它,比如通过 'parent-element' 并且知道名称 'superHandler'(不是实际名称)

Polymer('child-element',{
        clickHandler: function(){
            var p = document.querySelector('parent-element').superHandler;
            p(this);
        }
    });

更好的主意?

这是一种访问 Javascript 中父元素的简单方法。这适用于 a personal work(聚合物 0.5 - 如评论中所述,1.0 中有所不同)。未在 IE 上测试,但在我看来是一个简单的解决方案:

Polymer('sub-element', {
  ready: function(){
     this.parentNode;
  }
});

由于组件的性质,我对以这种方式访问​​parentNode犹豫不决。如果您需要样式,可以使用 :host() css 规则在没有它的情况下完成。恕我直言,除非你有充分的理由,否则接触父元素似乎很麻烦。为什么不使用自定义事件或像 localStorage 这样的中介商店?

另请查看 "The 'Gold Standard' Checklist for Web Components" 以获得有关最佳实践的更多帮助。

您可以使用自己的事件在元素之间传递数据。

父组件:

<polymer-element name="parent-element">
  <template>
    <!-- ... -->
    <sub-element></sub-element>
  </template>
  <script>
  Polymer({
    ready: function() {
      this.addEventListener('eventFromChild', this.myAction);
    },
    myAction: function(event) {
      console.log(event.detail);
    },
  });
  </script>

子组件:

<polymer-element name="sub-element" attributes="foo bar">
  <template>
    <!-- ... -->
    <button on-click="{{passParams}}">Send</button>
  </template>
  <script>
  Polymer({
    ready: function() {
      this.foo = 'abc';
      this.bar = '123';
    },
    passParams: function() {
      this.fire('eventFromChild', { foo: this.foo, bar: this.bar });
    },
  });
</script>

感谢您提供自定义事件建议。这让我回去再次查看核心元素以找到 this.

那我只需要加一个

<core-signals on-core-signal-my-event="{{myEventHandler}}"></core-signals>

触发名称为(在此示例中)"my-event" 的 "core-signal" 事件,并在父级上创建方法 "myEventHandler",例如

Polymer({
  myEventHandler: function(e,detail,sender) {...}
})