javascript - polymer 全局变量

标签 javascript polymer

我正在开发一个 Polymer 应用程序,它从 RESTful API 中提取数据并使用它来构建界面。我在概念上坚持的一个特定领域是在 http://www.polymer-project.org/docs/polymer/polymer.html#global 中描述的 Monostate 模式的实现。 .实际上,我可以将声明性属性添加到新组件 app-globals 中,然后相当直接地访问它。

这里是关键问题:如果我通过 core-ajax 将数据来回拉取(并可能重新提交)到 app-globals 组件中的 API,我如何确保 app-globals 的所有消费者组件有相同的数据?如果我使用建议的模式,我似乎失去了我的一元论:

<polymer-element name="my-component">
  <template>
    <app-globals id="globals"></app-globals>
    <div id="firstname"></div>
    <div id="lastname"></div>
  </template>
  <script>
    Polymer('my-component', {
      ready: function() { this.globals = this.$.globals; }
     });
  </script>
</polymer-element>    

因为每个使用 app-globals 的组件都将拉取它们自己版本的 API 数据。我错过了什么吗?有没有另一种方法可以确保应用始终只有一个版本的事实?

最佳答案

每次您在自定义组件中引用 app-globals 时,都会创建一个新的 app-globals 实例。但是这些实例中的每一个都可以共享许多属性(想想 Java 中的“静态”变量或 ObjC/Swift 中的“类”变量)。

app-globals 元素(或实际上任何 Polymer 元素)中的脚本只运行一次 - 将其视为在加载组件定义时运行。但是该脚本中的 Polymer 函数声明了一个配置对象,该对象具有属性和生命周期事件处理程序,将为每个实例单独创建。您引用的文档中的 app-globals 脚本(复制在更新下方:此版本已按稍后描述进行了修改)使用匿名闭包(一个立即运行的函数),其中包含共享变量和声明配置对象的 Polymer 函数依次引用共享变量。因此,该配置对象的每个实例 - 以及 app-globals 的每个实例 - 将引用同一组共享变量。

 <polymer-element name="app-globals">
  <script>
  (function() {
    var data = {
      firstName: 'John',
      lastName: 'Smith'
    }

    Polymer('app-globals', {
       ready: function() {
         this.data = data;
       }
    });
  })();
  </script>
</polymer-element>

如果一个自定义组件实例更改了其 app-globals 实例上的值(或者它们在内部更改,在您的情况下是 AJAX 调用的结果)所有其他组件实例引用app-globals 将看到更改后的值。

更新:原件,复制自:

http://www.polymer-project.org/docs/polymer/polymer.html#global

有一个缺陷,如@zreptil 所述,如果您更改数据值,则新值不适用于所有其他实例 - 因为实例变量只是引用字符串的副本。通过使用具有数据属性的对象,如上面的编辑版本,并且只读取和分配该对象的数据属性而不是覆盖对象本身,更改的值可以在实例之间共享。

关于javascript - polymer 全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24867741/

相关文章:

函数内 while 循环内的 Javascript If 语句中断页面

javascript - JSP Javascript 上传文件

javascript - 将 native javascript 对象值 react 到数组

css - 如何在 polymer 元素中设置多个元素的样式?

javascript - Polymer 的动画页面与 Angularjs 一起使用

javascript - 确定在 chrome 中调用了什么 javascript 函数

javascript - 使用 ExtJS 检查单选按钮

nginx - Polymer Starter Kit - Nginx 服务器上的漂亮 URL

javascript - 结合变化的 Polymer 1.0 Array Observers

ajax - 使用 Polymer 实现声明式集合渲染的最佳方法是什么?