2016-05-16 25 views
4

Web要素のカスタムHTML要素を調べていて、カスタム要素にカスタム属性を追加する際に問題が発生しています。 "flagtext"属性で指定されたテキストを表示するこのような単純な要素については、常にデフォルト値が表示されます。カスタムHTML要素の属性が表示されない - Web-Components

<test-flag flagtext="my text"></test-flag> 

完全なJSBinサンプルはhereです。

JSBinはPolymerライブラリを使用しています(これが私がそこに引き込める唯一のものです)。私は一般的に同じ結果をwebcomponents.jsを使用しています。 Chrome 49とFirefox 45の両方で同じ結果が得られます。コンソールまたはデバッガにエラーが表示されません。

ウェブ上にあるすべてのサンプルには同様のコードがありますが、さまざまなバージョンを試しましたが、常に更新を拒否しています。 JSBinにいくつかのサンプルをコピーしても、どちらも機能しません。

何が間違っている可能性がありますか?私はそれが実験的な技術だと理解していますが、これがうまくいかないという一貫性は依然として驚くべきことです。この基準は放棄されていますか? (私は、カスタム要素の最新の2016年4月のW3Cドラフトが、そのアプローチを完全に変更したことを知っています。)

"attributeChangedCallback"関数を定義すると起動しません。 Javascriptでプロパティを簡単に変更できますが、これは問題ではありません。

しかし、私が想定しているようにマークアップでプロパティを指定できないのはなぜですか?

編集 - 完全なコードあなたがHTMLのインポート用に別々のファイルにこれらを配置する必要があり、そしてあなたは「webcomponents-lite.js」ライブラリを必要とするだろうと

注意。

メインHTMLファイル

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <style> 
     test-flag 
     { 
      border: 1px solid blue; 
     } 
    </style> 
</head> 
<body> 
    <script src="lib/webcomponents-lite.min.js"></script> 
    <link rel="import" href="test-flag.html"> 

    Here is the custom test-flag component: 
    <p>  
    <test-flag flagtext="my text"></test-flag> 
</body> 
</html> 

ファイル:テストflag.html

<template> 

    <style> 
    </style> 

    Content: 
    <div id="testflagID"> 
    </div> 

</template> 


<script>  

    (function() { 

     var _currentScript = (document._currentScript || document.currentScript); 
     var importDoc = _currentScript.ownerDocument; 
     var customPrototype = Object.create(HTMLElement.prototype);   
     Object.defineProperty(customPrototype, 'flagtext', {value: '(default)', writable: true});  
     document.registerElement('test-flag', {prototype: customPrototype}); 


     customPrototype.createdCallback = function() 
     { 
      var template = importDoc.querySelector('template'); 
      var clone = document.importNode(template.content, true); 
      var idx = clone.querySelector("#testflagID"); 
      idx.textContent = this.flagtext; 
      var root = this; 
      var createdElement = root.appendChild(clone); 

     }; 

    })(); 

</script> 
+1

WebコンポーネントはChrome専用です。 ChromeとOpera以外のすべてのブラウザでは動作しません(オペラはクロムと同じエンジンを使用しています)。 http://caniuse.com/#search=componentsこれを使用しないでください –

+1

(a)これは正しくありません - webcomponents.js polyfillは多くのブラウザで機能を有効にしています。 Chromeで作業している場合は – nepdev

+0

'機能を有効にする 'が間違っています。動作をエミュレートしますが、Webコンポーネントではありません。しかし、私は自分の仕事からjsbin.comにアクセスすることはできません。なぜなら、質問の中でコード**を共有するほうがいいからです(** [ヘルプセンター](http://stackoverflow.com/help)) )。 –

答えて

7

自動的に一緒にリンクされていない2つの概念があります。 HTMLコードで

<test-flag flagtext="my text"></test-flag> 

...用語flagtextは、HTML属性(ないプロパティ)です。 JavaScriptコードで

Object.defineProperty(customPrototype, 'flagtext', {value: '(default)', writable: true}) 

...用語flagtextは、JavaScriptのプロパティ(ない属性)です。標準的な要素について

、ブラウザは自動的に属性値(及びその逆)へプロパティ値を結合します。カスタム要素についても(標準属性)。しかし、カスタム属性を追加する場合は、手動でバインドする必要があります。

例えば、createdCallback()方法では、追加:

this.flagtext = this.getAttribute('flagtext') || '(default)' 

ライブサンプル:

document.registerElement('test-flag' , { 
 
    prototype: Object.create(HTMLElement.prototype, { 
 
    flagtext: { 
 
     value: '(default)', 
 
     writable: true 
 
    }, 
 
    createdCallback: { 
 
     value: function() 
 
     { 
 
     this.flagtext = this.getAttribute('flagtext') || this.flagtext 
 
     this.innerHTML = 'flagtext=' + this.flagtext 
 
     } 
 
    }, 
 
    }) 
 
})
<test-flag flagtext='new content'>Hello</test-flag>

NB:attributeChangedCallback()方法属性が要素作成後にに変更された場合にのみ発生します(ここでは該当しません)。

+0

偉大な - これは動作します! – nepdev

+0

@Supersharp私はこれを1ヶ月前に見つけたと思う。私は、プロパティと属性がどのように関連しているのか、なぜ私はそれらがいくつかのケースでバインドされていて、いくつかのケースではそうではなかったということについて、私のBを探していました。 これは、Webコンポーネントを宣伝しているすべてのブログやサイトによって、これがより明確になりたかったと思います。 非常に遅く到着しましたが、素晴らしいです。どうもありがとう – LongHike

関連する問題