【问题标题】:Polymer - JavaScript - Data Binding: Real-time update?Polymer - JavaScript - 数据绑定:实时更新?
【发布时间】:2017-10-25 14:13:39
【问题描述】:

我有两个页面:my-view1my-view2。 在 my-view1 上,我有两个按钮可以在 LocalStorage 中添加和删除数据。 在 my-view2 上,我有两个简单的 div 读取(显示)总值和过去 6 个月的总值。

但是,在第二个页面上,如果页面没有刷新,值不会更新。我希望 my-view2 中的值在每次加载页面时自动更新(查看,即使缓存)。

这是一个带有 my-view2 的 plnkr,因此您可以理解我正在尝试做的事情。

https://plnkr.co/edit/ul4T2mduxjElCN4rUUKd?p=info

我该怎么做?

【问题讨论】:

  • 您可以使用 websockets 来动态更新您的页面(view-2),无论何时更改值或您有任何后端,您都可以为此目的使用事件流。对于当前场景,您可以简单地使用 setinterval 来检查您本地存储的每一秒是否有任何更改反映您页面中的更改。
  • 非常感谢您的回复!我目前正在将此页面构建为 PWA。即使离线,websockets 也会工作吗?另外,使用 setInterval 会让应用程序休眠吗?还是会持续运行?
  • setInterval 将在离线模式下工作,是的,您可以设置一个逻辑来识别如果应用程序处于睡眠模式,您可以停止间隔检查,当从睡眠模式唤醒时,您可以恢复。但是对于 websocket,您需要有效的互联网连接,如果您同时使用 myview-1 和 myview-2,您可以使用发布消息来通信和更新 my-view-2。
  • 所以我唯一的选择仍然是 setInterval?我不知道设置一个“逻辑”来识别应用程序是否处于睡眠模式,因为我刚开始使用 JS 和 Polymer,并遵循入门指南。我在想也许有一种方法可以在每次查看页面时重置该值。或者,我可以设置一个在单击时更新值的按钮吗?
  • 是的,您可以设置一个按钮,甚至可以设置一个事件侦听器,比如说Page Visibility API,它可以触发可见或隐藏状态,您可以使用这些输出来执行何时停止间隔和如果您的页面再次处于活动状态,则使用 clearinterval 函数逻辑开始间隔始终是您想要的程序结果。

标签: javascript data-binding polymer


【解决方案1】:

你可以在更新localStorage时监听storage事件来触发和更新my-view2中的一些prop:

<my-view-2 id="myView2"></my-view-2>
<script>
  window.onstorage = function(e) {
    if (e.key !== 'someKeyYouWant') return;
    document.getElementById('myView2').set('someProp', {
      oldValue: e.oldValue,
      newValue: e.newValue
    });
  };
</script>

编辑(working plunk):由于here 描述的行为,存储事件不会在发起更改的窗口上触发,因此您必须触发自己的存储事件,请考虑以下方法:

saveToLs(e) {
  e.preventDefault();
  const newName = this.get('dogName');
  const ls = window.localStorage;
  const synthEvent = new StorageEvent('storage');
  const eventConfig = [
    'storage', 
    true, 
    true, 
    'myDog', 
    ls.getItem('myDog'), 
    newName
  ];

  synthEvent.initStorageEvent(...eventConfig);

  setTimeout((() => { // ensure async queue
    ls.setItem('myDog', newName);
    this.dispatchEvent(synthEvent);
  }).bind(this), 0);
}

...在聆听方面:

handleStorageUpdate(e) {
  if (e.key !== 'myDog' || e.newValue === this.get('dogName')) return; 
  this.set('dogName', e.newValue);
}

请注意if 条件处理具有相同值的潜在重复更新。

这里有一个working plunk 供你玩

【讨论】:

  • 您好!感谢您的回复。我已将代码添加到my-view2 页面,但我仍然无法使其工作。我什至尝试将“值替换”替换为 console.log 以查看它是否读取 LocalStorage,但不会。我很确定我在代码中做错了什么,但就是不明白在哪里。我做了一个plnkr:plnkr.co/edit/HCIw7ExZ2rg7XEjQMLZi?p=catalogue
  • 由于stackoverflow.com/a/4679754/2533680 此处描述的行为,该解决方案将无法自行运行,我将使用一个工作示例更新我的答案。
  • 所以我没有办法做到这一点?
  • 检查正在工作的 plunker,有一种方法可以做到,但它需要你自己制作事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多