2016-06-30 102 views
0

使用聚合物-Cli工具和購物車樣板作爲起點,我做了一個簡單的模型來說明用例。聚合物1.6和Polymer-cli,從自定義元素中訪問應用屬性

假設你的index.html文件包括「測試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> 

,假設包含以下(又是我-應用程序的簡化僅僅拷貝測試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> 

所以,真正的問題是,測試元素如何訪問主應用中的屬性「siteUrl」? 我打算讓這個變量只讀,並從其他自定義元素訪問它。 我更喜歡這種方法VS將siteUrl作爲屬性傳遞給測試元素元素。

您認爲如何?

+1

我幾乎可以肯定的是,'APP-location'元素爲你提供。 –

+0

這只是訪問虛擬屬性的示例。 這個想法是有幾個特定的​​只讀屬性可以從我的自定義元素中讀取... – rud

+0

我可能不會很好地理解您的問題,因爲它接合您所建議的解決方案對於將場地URI作爲屬性到測試元素元素「,這是聚合物的方式。你將用方括號來完成圍繞變量的readOnly要求,就像這個'[[siteUrl]]'一樣。我建議你閱讀Polymer文檔中的[Property change notification and two-way binding](https://www.polymer-project.org/1.0/docs/devguide/data-binding#property-notification)。 –

回答

1

通過使用Data Binding system元素來傳遞信息的正確方法,即「傳遞SITEURL作爲對測試elemet元素的屬性」

你會完成與周圍的方括號中的變量只讀要求,如Property change notification and two-way binding中所述的[[siteUrl]]

就像你說的一樣

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

    Polymer({ 

    is: 'test-app', 

    // ... 

    }); 

</script> 

您可以在全球環境中設置一個變量,你可以在每一個元素訪問它。

但是,正如你所知,不建議使用全局變量。關於爲什麼在下面的鏈接參考。

相關問題