2017-08-02 5 views
2

私はPolymer 2.0を学ぼうとしていますが、別のShadow Domから要素を取得するという問題に悩まされています。これはポリマー1では機能したが、ポリマー2.0では機能しなかった。これを書いている正しい方法は何ですか?それはちょうど私に、targetText = Nullと伝えます。Polymer 2.0異なるShadowDomのgetElementById

ありがとうございました!

これはMWEです: ポリマーWC 1:

<dom-module id="sc-navdrawer"> 
<template> 
<style is="custom-style"> 
p { 
    font-weight: bold; 
} 
.changed { 
    color: red; 
} 
</style> 
<p>Some text in normal p tag</p> 
<div id="test" class="htmltextcontent" inner-h-t-m-l="{{inputText}}"></div> 
</template> 

<script> 
    Polymer({ 
     is: 'sc-navdrawer', 
     properties: { 
      inputText: { 
      type: String, 
      value: "<p>Some innerhtml text in p tags</p>" 
      } 
     } 
    }); 

</script> 
</dom-module> 

ポリマーWC 2:代わりにgetElementByIdをを使用しての

<dom-module id="sc-testpage"> 
<template> 

<button onclick="{{changeColor}}">Click here to change color</button> 
</template> 

<script> 
    Polymer({ 
     is: 'sc-testpage', 
     changeColor: function() { 
      var targetText = document.getElementById("test"); 
      console.log(targetText); 
      targetText.classList.add("changed"); 
     } 
    }); 

</script> 
</dom-module> 
+0


1. https://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/
が互いに関連とにかくにおけるこれら二つの要素です:彼らはshadowDomがどのように動作するかをあなたに説明しますこれらのリンクを見ていますか?彼らは子供の親の関係を持っているという意味ですか? – Niklas

答えて

2

最初に私が見るものは、document.getElementById("test");を使用していますが、これがShady Domを使用したと言えばうまくいきます。
ポリマー2はシャドウドームを使用するように強制するので、このコマンドはPolymer.dom(this.root).querySelector("#test")に置き換えてください。 Shadow Domはあなたのコンポーネントをカプセル化するので、documentオブジェクト
でコンテンツにアクセスすることはできませんが、これで問題は解決しません。このカプセル化は、他のコンポーネントからid:xyzの要素にアクセスできないように、WebComponentのコンテンツにアクセスできないことを意味します。 2. https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM
3. https://glazkov.com/2011/01/14/what-the-heck-is-shadow-dom/

+0

ありがとうございます。はい、これは本当に問題です。リンクありがとうございました。私はそれらを読むでしょう。私はまた、同じWC内から要素にアクセスすることができないことに気づいた。 – Vims

+0

ありがとうございます。あなたは私を正しい軌道に乗せる。私はまだこれに慣れなければならないが、私はそれが働いている! – Vims

+0

驚くべきポリマーは、最初は奇妙ですが、完全に理解すれば非常に強力になります。 –

0
  1. 場合は、この作品Automatic node findingを使用する必要がありますあなたの2つの要素はお互いに親の関係にあります。
  2. また、WC 2のボタンでonclickを使用する代わりに、オンタップを使用する必要があります。これはPolymerのドキュメントで推奨される方法です。

  3. さらに、onclick属性に2方向データバインディングを使用している理由はわかりません。私は何かが不足しているかもしれませんが、あなたのコードは正常な関数呼び出しで完璧に動作するはずです。

    <dom-module id="sc-testpage"> 
        <template> 
        <button on-tap="changeColor">Click here to change color</button> 
        </template> 
    
        <script> 
        Polymer({ 
         is: 'sc-testpage', 
    
         changeColor: function() { 
         var targetText = this.$.sc-navdrawer.$.test; 
         console.log(targetText); 
         targetText.classList.add("changed"); 
         } 
        }); 
    
        </script> 
    </dom-module> 
    
+0

あなたの答えをありがとう。実際、双方向バインディングは必要ではなく、オンクリックでもありませんが、問題を示すために非常に高速なMWEを作成しました。私はあなたの提案を試みたが、うまくいかなかった:両方の要素が同じ親を持ち、sc-navprawerがsc-testpageの親であるか、またはその逆ではない。また、あなたのコードでは、 'this。$ scNavdrawer。$。test'を代わりに使う必要があると思いますか?いずれにせよ、常にtargetTextをNullとして返します。私はこれがポリマー2で変わったものだと思います。 – Vims

+1

実際には、ポイント1.は、少なくとも親のものについての部分は間違っています。これはPolymer 1とshady domでのみ機能しました。 –

0

紙入力を使用して、それが値です設定してみてください:

var targetText = this.$.inputText;

(:次に、あなたはこのように変数にアクセスすることができます

<paper-input id="test" label="input" value="{{inputText}}"></paper-input>

ティ

関連する問題