如何构建Polymer SPA?

时间:2015-06-18 18:39:34

标签: polymer web-component

我是Polymer 1.0的新手。

我得到了整个"一切都是元素"哲学,但到了什么程度? 如何将所有这些元素组合在一起?

TL; DR:一般来说,是否有与Polymer和WebComponents相同的main()函数?如果是的话,它应该在哪里以及它应该做什么?

我通常会查看示例,演示和项目以了解它应该如何工作,但由于Polymer是如此新颖(尤其是v1.0),我很难找到非平凡的例子。

长版

我了解如何使用Polymer创建元素。 但是,当我想要与他们联系时,我正在遇到一个路障。我用什么结构来让组件在它们之间进行交谈。

来自Angular背景我对相应的内容有一个相对准确的看法。 例如:数据包含在可从控制器,指令和html元素访问的范围内,您可以使用服务从应用程序的不同部分提取数据。

在聚合物中,我不知道数据的边界在哪里。 不是在组件本身,而是在它之外,它存在的地方以及另一个组件是否可以访问它。 一个简单的绘图可以帮助我很多。在聚合物文档中没有解释这样的事情,可能是因为它比聚合物更广泛。

为了让您了解我的问题,这就是我遇到的问题:

  1. 我根据Polymer Starter Kit
  2. 设置了SPA
  3. 我想用firebase-element
  4. 将它连接到firebase
  5. 我创建了自己的元素,它本身使用<firebase-auth>

    <link rel="import" href="../../bower_components/polymer/polymer.html">
    <link rel="import" href="../../bower_components/firebase-element/firebase-auth.html">
    
    <dom-module id="my-login">
      <template>
        <firebase-auth id="firebaseLogin"
          user="{{user}}"
          location="https://my-project.firebaseio.com"
          provider="facebook"
          on-error="_errorHandler"
          on-login="_loginHandler"></firebase-auth>
    
        <button on-tap="login">Login with facebook</button>
        <button on-tap="logout">Logout</button>
      </template>
    </dom-module>
    <script>
    Polymer({
      is: 'my-login',
      properties: {
        successRedirect: String
      },
      _errorHandler: function(e){
        console.log(e.detail);
      },
      _loginHandler: function(e){
        if(this.successRedirect){
          // How can I tell pagejs to redirect me ?
          app.route = this.successRedirect;
        }
      }
    });
    </script>
    
  6. 基本上如何在成功登录后告诉pagejs(我的路由库)将应用程序重定向到页面?我的pagejs配置存在于它自己的routing.html文件中,我不明白如何拼凑所有这些。

    我希望有人能够理解这个广泛的问题并希望能帮助我。

    由于

1 个答案:

答案 0 :(得分:0)

简短回答:事件听众。在路由器上放置一个事件监听器。让登录处理程序在路由器上触发事件。路由器将接收该事件,然后重定向。

...
_loginHandler: function(e){
  if(this.successRedirect){
    // How can I tell pagejs to redirect me ?
    var router = document.querySelector('router');
    router.dispatchEvent(new Event('redirect', {redirectURL: this.successRedirect});
    app.route = this.successRedirect;
  }
}
...

然后在路由器中:

connectedCallback() {
  this.addEventListener('redirect', function(event) {
    var url = event.redirectURL;
    // Redirect using the router's API.
  });
}