首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从<iron-ajax>回调中路由

如何从<iron-ajax>回调中路由
EN

Stack Overflow用户
提问于 2017-07-23 05:15:25
回答 2查看 342关注 0票数 0

给定index.html (my-app)中包含iron-pages的根组件,以及其中一个或多个页面中的iron-ajax调用,子组件中的iron-ajax on-response函数通知my-app更改路由的最佳方式是什么?我使用的是聚合物2。我看到的例子依赖于不同组件中的链接,并且在同一组件中调用,但没有从一个组件到其父组件的iron-ajax

my-app.html中,我有一个app-locationapp-route,以及iron-pages

代码语言:javascript
复制
<app-location route="{{route}}"></app-location>
<app-route
  route="{{route}}"
  pattern="/:page"
  data="{{routeData}}"
  tail="{{subroute}}"></app-route>

<app-toolbar>...

<iron-pages role="main" selected="[[routeData.page]]" 
    attr-for-selected="name" selected-attribute="visible" 
    fallback-selection="404">
  <my-login name="" route="[[subroute]]"></my-login>
  <my-todos name="my-todos" route="[[subroute]]"></my-todos>
  ...
  <my-404-warning name="404"></my-404-warning>
</iron-pages>

用户首先看到的是my-login。当my-login中的iron-ajax调用完成时,我想用my-todos替换my-login。到目前为止,我已经提出了两种方法(见下文)。这两种方法都有效--更改页面和更新URL--但其中一种一定更好吗?有没有我找不到的更干净的方法?

my-login中的iron-ajax响应处理程序

代码语言:javascript
复制
_handleLogin(e) {
  if (e.detail.response) {
    let loginInfo = e.detail.response;
    if (loginInfo.o_error) {
      console.log('login error: '+loginInfo.o_error);
      // ...
    } else {
      this.dispatch('login', loginInfo); // to polymer-redux store

      // UPDATE PATH, OPTION #1
      var page = this.ownerDocument.body.children[0];
      page.set('route.path', 'server-catalog');

      // UPDATE PATH, OPTION #2
      this.dispatchEvent(new CustomEvent('change-route', {
         bubbles: true, composed: true, detail: "my-todos" }));

      // UPDATE PATH, OPTION #3..n
      ???
    }
  } else {
    console.log(e.detail);
  }
}

这两个选项都会触发观察者_routePageChanged(routeData.page),这样魔术就会继续。

选项#1很简单,但涉及到直接访问父应用程序my-app。

选项#2依赖于my-app的两个附加功能

代码语言:javascript
复制
ready() {
  super.ready();
  // Custom elements polyfill safe way to indicate an element has been upgraded.
  this.removeAttribute('unresolved');
  // listen for custom events
  this.addEventListener('change-route', (e)=>this._onChangeRoute(e));
}

_onChangeRoute(e) {
  this.set('route.path', e.detail);
}

第二种选择感觉更好,但我想知道这是不是我能做的最干净的选择。

EN

回答 2

Stack Overflow用户

发布于 2017-07-24 01:35:10

建议通过数据绑定将routeData传入<my-login>,并在_handleLogin()中设置routeData.page = "my-todos"

票数 0
EN

Stack Overflow用户

发布于 2017-08-08 05:36:16

我在app-location文档中找到了第三种方法(我想我会使用它):"app-location在更新位置时在window上触发一个location-changed事件“。所以,

代码语言:javascript
复制
window.history.pushState({}, null, '/new_path');
window.dispatchEvent(new CustomEvent('location-changed'));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45259298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档