【问题标题】:Magic property method魔法属性法
【发布时间】:2017-04-30 22:30:29
【问题描述】:

我正在尝试创建一个组件来处理我们的应用程序的配置。因为我事先不知道可能会设置哪些属性,所以我手动将它们映射到组件上的 settings 对象。我想创建一个魔术函数,所以每当我尝试获取属性时,组件都会从 settings 对象中获取属性。

我尝试过的

我认为我需要使用a proxy,但我不知道如何让它在组件中工作。我是否将其添加到 ready 生命周期回调中?

【问题讨论】:

  • “我想创建一个魔术函数,所以每当我尝试获取属性时,组件就会......” 当您尝试获取属性时 从什么
  • 我正在创建的组件
  • 那么当代码在任何地方出现component.foo 时,你想要神奇的功能启动吗?
  • 这正是我的计划 =)

标签: javascript polymer polymer-1.0 web-component getter-setter


【解决方案1】:

下面的幼稚实现使用嵌套的app-storage App 元素来简化会话之间设置的持久性。在这种情况下不需要代理。 [代码没有经过测试,因为我现在没有可以测试的环境,但它非常简单,应该可以开箱即用。]

<dom-module id="my-config">
  <template>
    <app-localstorage-document key="settings"
                               data="{{settings}}">
    </app-localstorage-document>
  </template>
  <script>
    Polymer({
      is: "my-config",

      properties: {
        settings: {
          type: Object,
          value: false,
          // notify: true,                 // use this to stay tuned
          // observer: '_settingsChanged'  // use this to stay tuned
        }
      },

      created: function() {
        console.log('Settings created and loaded: [', settings, ']!');
      },

      get: function(key) {
        return this.settings[key];
      },

      set: function(key, value) {
        return this.settings[key] = value;
      }
    });
  </script>
</dom-module>

使用“魔法属性”:

  properties: {
    settings: {
      type: Object,
      value: new Proxy({}, {
        get: function(target, key) {
          return key in target? target[key] : nil;
        },
        set: function(target, key, value) {
          return target[key] = value;
        }
      })
    }
  },

【讨论】:

  • 我知道使用函数 (get) 有效,但我想知道是否有办法使用魔法属性
  • 请查看更新。 settings.foo 现在应该可以按预期工作了。尽管如此,我确信get/set 方法更干净。
  • 嗯,意外令牌:代理
  • 我实在想不出办法,抱歉
  • 哦,我的例子中有一个愚蠢的错字,当然必须有一个有效的对象,例如value: new Proxy({}, { 而不是以前的 new Proxy({}, {
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 2016-09-29
  • 2014-02-26
  • 1970-01-01
  • 2010-12-10
  • 2011-04-23
相关资源
最近更新 更多