在不同级别(DOM)元素之间更改数据的最佳方法是什么?
例如,我想在index.html(<template is="auto-binding"
)的变量中保存REST服务基础URL,因此无论层次结构如何,我都可以从项目的任何位置访问此值。
我猜<core-storage>
会是一种选择,是吗?还有什么其他选择?
由于
修改
刚刚在这里找到了答案:https://stackoverflow.com/a/24876397/2750721
答案 0 :(得分:2)
我做的事情就像在#34;支持全局变量&#34;下的Polymer docs中所建议的那样。 https://www.polymer-project.org/0.5/docs/polymer/polymer.html#global。创建一个使用函数闭包的元素在元素的所有实例之间共享状态,然后在需要访问共享数据时创建该元素的实例。
直接从文档中复制:
<polymer-element name="app-globals">
<script>
(function() {
// these variables are shared by all instances of app-globals
var firstName = 'John';
var lastName = 'Smith';
Polymer({
ready: function() {
// copy global values into instance properties
this.firstName = firstName;
this.lastName = lastName;
}
});
})();
</script>
</polymer-element>
然后像使用其他任何元素一样使用元素。您可以 使用Polymer数据绑定或纯JavaScript访问其属性:
<polymer-element name="my-component">
<template>
<app-globals id="globals"></app-globals>
<div id="firstname">{{$.globals.firstName}}</div>
<div id="lastname">{{$.globals.lastName}}</div>
</template>
<script>
Polymer({
ready: function() {
console.log('Last name: ' + this.$.globals.lastName);
}
});
</script>
</polymer-element>
答案 1 :(得分:2)
在前面的答案中解释为Trevor Dixon,您可以使用全局变量。 Divshot为他们的许多应用程序(甚至在它正式出现在文档之前)执行此操作,但他们使用自己的自定义元素进行全局变换。
到目前为止,他们的答案并非万无一失。到目前为止,我的经验取决于最佳做法的情况。以下是我通常会想到的一些概括......
<core-storage>
,<local-forage>
,pouchDB,IndexedDB,Cookie等)
localStorage
以5mb为基础),通常是同步API(不是所有人都喜欢Mozilla&# 39; s localForage
),仅限于一个浏览器,可以快速维护状态 通常情况下,您不会将这些策略的组合与数据最终持久化并与之同步的RESTful API结合使用。情况并非总是如此,但它在客户端的现代JavaScript应用程序中很常见。
答案 2 :(得分:0)
您可以使用自定义事件来提醒多级元素之间的更改,例如
<component-1>
Polymer({
ready: function() {
this.addEventListener("data-change", function(e) {
this.data = e.detail.data;
});
},
</component-1>
<component-deep>
Polymer({
dataChanged: function() {
this.fire("data-change", {data: this.data});
}
});
</component-deep>