2016-06-30 19 views
0

polymer-cliツールとショッピングカートボイラープレートを使用して、ユースケースを説明する簡単なモックアップを作成しました。Polymer 1.6 and Polymer-cli、カスタム要素内からアプリケーションプロパティにアクセス

私のアプリの(以下、再び単なる単純化されたコピーを含むテストapp.htmlを想定して、今すぐ

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> 

    <title>My App</title> 

    <link rel="shortcut icon" sizes="32x32" href="/images/app-icon-32.png"> 

    <meta name="theme-color" content="#fff"> 
    <link rel="manifest" href="/manifest.json"> 

    <script> 

    // setup Polymer options 
    window.Polymer = {lazyRegister: true, dom: 'shadow'}; 

    // load webcomponents polyfills 
    (function() { 
     if ('registerElement' in document 
      && 'import' in document.createElement('link') 
      && 'content' in document.createElement('template')) { 
     // browser has web components 
     } else { 
     // polyfill web components 
     var e = document.createElement('script'); 
     e.src = '/bower_components/webcomponentsjs/webcomponents-lite.min.js'; 
     document.head.appendChild(e); 
     } 
    })(); 

    // load pre-caching service worker 
    if ('serviceWorker' in navigator) { 
     window.addEventListener('load', function() { 
     navigator.serviceWorker.register('/service-worker.js'); 
     }); 
    } 

    </script> 

    <!-- <link rel="import" href="/src/bewi-app.html"> --> 
    <link rel="import" href="/src/test-app.html"> 

    <style> 

    body { 
     margin: 0; 
     font-family: 'Roboto', 'Noto', sans-serif; 
     line-height: 1.5; 
     min-height: 100vh; 
     background-color: #eee; 
    } 

    </style> 

</head> 
<body> 
    <span id="browser-sync-binding"></span> 

    <test-app id="test"></test-app> 

</body> 
</html> 

あなたのindex.htmlファイルは、「テスト・app.html」が含まれると仮定し、一致するタグ.htmlを):

<link rel="import" href="../bower_components/polymer/polymer.html"> 
<link rel="import" href="../bower_components/app-route/app-location.html"> 
<link rel="import" href="../bower_components/app-route/app-route.html"> 
<link rel="import" href="test-element.html"> 

<dom-module id="test-app"> 

    <template> 

    <app-location route="{{route}}"></app-location> 
    <app-route 
     route="{{route}}" 
     pattern="/:page" 
     data="{{routeData}}" 
     tail="{{subroute}}"></app-route> 

     test-element is loaded bellow 
     <test-element></test-element> 
    <div> 
    </div> 
    </template> 

    <script> 

    Polymer({ 

     is: 'test-app', 

     properties: { 

     page: { 
      type: String, 
      reflectToAttribute: true, 
      observer: '_pageChanged' 
     }, 
     baseUrl: { 
      type: String, 
      value: '/' 
     }, 
     siteUrl: { 
      type: String, 
      value: 'http://fqdn.local' 
     } 
     }, 

     observers: [ 
     '_routePageChanged(routeData.page)' 
     ], 

     _routePageChanged: function(page) { 
     this.page = page || 'view1'; 
     }, 

     _pageChanged: function(page) { 
     // load page import on demand. 
     this.importHref(
      this.resolveUrl('my-' + page + '.html'), null, null, true); 
     } 

    }); 

    </script> 

</dom-module> 

さて、テストelement.html

<link rel="import" href="../../bower_components/polymer/polymer.html"> 

<dom-module id="test-element"> 
    <template> 
    <div> I am a test </div> 
    </template> 

    <script> 
    (function() { 
    'use strict'; 

    Polymer({ 
     is: 'test-element', 
     ready: function() { 
     console.log('READY'); 
     console.log('find #test using document.querySelector', document.querySelector('#test')); // OK 
     console.log('find #test .siteUrl using document.querySelector', document.querySelector('#test').siteUrl); // undefined 
     console.log('find #test .siteUrl using Polymer.dom', Polymer.dom(document.querySelector('#test')).siteUrl); // undefined 
     console.log('find #test .siteUrl using Polymer.dom().node', Polymer.dom(document.querySelector('#test')).node.siteUrl); // undefined 
     console.log('find #test .siteUrl using Polymer.dom().properties', Polymer.dom(document.querySelector('#test')).node.properties); // {object} but, I'm guessing not the computed values of the properties 

     // So, how may I access the #test app's "siteUrl" property from within a custom element? 
     } 
    }); 
    })(); 
    </script> 
</dom-module> 

だから、本当の問題は、ありますどのようにtest要素がメインアプリケーションの "siteUrl"プロパティにアクセスするのでしょうか? この変数をreadOnlyにし、他のカスタム要素からアクセスする予定です。 私はこのアプローチを推奨しています。テストエレメント要素に属性としてsiteUrlを渡します。

あなたはどう思いますか?

+1

私は 'アプリ-location'要素はあなたのためにそれを提供することをほぼ確信しています。 –

+0

これは、ダミーのプロパティにアクセスするための単なる例です。 アイデアは、私のカスタム要素内からいくつかの特定のreadOnlyプロパティを読むことができるようにすることです... – rud

+0

あなたが提案した解決策が "siteUrlを属性として渡す"テスト・エレメント・エレメントに "これはポリマー・ウェイです。この[[siteUrl]]のように、角括弧で変数を囲むreadOnly要件を達成します。 Polymerのドキュメントから[プロパティ変更通知と双方向バインディング](https://www.polymer-project.org/1.0/docs/devguide/data-binding#property-notification)を読むことをお勧めします。 –

答えて

1

要素Data Binding systemを使用しているを介して情報を渡すための正しい方法、すなわち

「テストelemet要素の属性としてSITEURLを渡して」あなたは角括弧で変数を囲む読み取り専用の要件を達成するだろうこのようにProperty change notification and two-way bindingに記載されている[[siteUrl]]のようになります。

あなたは

<script> 
    var myGlobalVar = 'is accessible in any element' 

    Polymer({ 

    is: 'test-app', 

    // ... 

    }); 

</script> 

のように言ったようにあなたは、地球環境変数を設定することができますし、すべての要素にアクセスすることができます。

しかし、グローバル変数はお勧めできません。なぜ下のリンクの理由についての参照。

関連する問題